需求: 項目的支付流程中 下單-支付-通知 目前支付可用自己支付中心api,也可用銀聯的sdk ,在使用自己支付中心的時候不用刷新訂單因爲支付中心已經做了這個操作.
但是使用第三方銀聯sdk 的時候需要在銀聯回調之後通知後臺,調取後臺支付完成接口.
由於可能存在使用銀聯sdk 支付成功,但通知失敗情況(網絡或設備異常).所以需要緩存請求數據,在適當條件下重新調用更新訂單接口,
分析以及解決方案 : 目前請求數據是以map形式存入的. 需要緩存map. 但是通知可能有多個所以需要 存入list. list需要去重. 最終List 是以string類型存入.
代碼:
package com.sourceforge.simcpux_mobile.module.util;
import android.content.Context;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* 緩存工具類
* Created by liuml on 2019-09-11 10:09
*/
public class DataCacheUtil {
private ACache aCache;
private static DataCacheUtil mInstance;
public DataCacheUtil(Context context) {
aCache = ACache.get(context);
}
/**
* 單例
*
* @param context
* @return
*/
public static DataCacheUtil getInstance(Context context) {
if (mInstance == null) {
synchronized (DataCacheUtil.class) {
if (mInstance == null) {
mInstance = new DataCacheUtil(context.getApplicationContext());
}
}
}
return mInstance;
}
/**
* 添加map 到list 中
*
* @param key
* @param map
*/
public void addMapToList(String key, Map map) {
List list = getListMap(key);
if (list != null) {
list.add(map);
distinctList(list);
// String value = GsonUtils.gsonString(map);
aCache.put(key, GsonUtils.gsonString(list));
// LogUtil.d("不爲空的情況: " + GsonUtils.gsonString(list));
} else {
list = new ArrayList();
list.add(map);
aCache.put(key, GsonUtils.gsonString(list));
// LogUtil.d("爲空的情況: " + GsonUtils.gsonString(list));
}
}
/**
* 根據key取出 list
*
* @param key
* @return
*/
public List<Map> getListMap(String key) {
final String string = aCache.getAsString(key);
final List lists = GsonUtils.gsonToListMaps(string);
if (lists != null) {
return lists;
}
return null;
}
/**
* 去除重複元素
*
* @param list
* @return
*/
public List distinctList(List list) {
HashSet h = new HashSet(list);
list.clear();
list.addAll(h);
return list;
}
/**
* 根據key刪除整個list
* @param key
*/
public void removeList(String key) {
aCache.remove(key);
}
}
ACache 是個工具類
https://github.com/yangfuhai/ASimpleCache
GsonUtils
public class GsonUtils {
private static Gson gson = null;
static {
if (gson == null) {
gson = new Gson();
}
}
public GsonUtils() {
}
/**
* 對象轉成json
*
* @param object
* @return json
*/
public static String gsonString(Object object) {
String gsonString = null;
if (gson != null) {
gsonString = gson.toJson(object);
}
return gsonString;
}
/**
* Json轉成對象
*
* @param gsonString
* @param cls
* @return 對象
*/
public static <T> T gsonToBean(String gsonString, Class<T> cls) {
T t = null;
if (gson != null) {
t = gson.fromJson(gsonString, cls);
}
return t;
}
/**
* 轉成list
* 解決泛型問題
*
* @param json
* @param cls
* @param <T>
* @return
*/
public static <T> List<T> jsonToList(String json, Class<T> cls) {
// Gson gson = new Gson();
List<T> list = new ArrayList<T>();
JsonArray array = new JsonParser().parse(json).getAsJsonArray();
for (final JsonElement elem : array) {
list.add(gson.fromJson(elem, cls));
}
return list;
}
/**
* json轉成list<T>
*
* @param gsonString
* @param cls
* @return list<T>
*/
public static <T> List<T> gsonToList(String gsonString, Class<T> cls) {
List<T> list = null;
if (gson != null) {
list = gson.fromJson(gsonString, new TypeToken<List<T>>() {
}.getType());
}
return list;
}
/**
* json轉成list中有map的
*
* @param gsonString
* @return List<Map < String , T>>
*/
public static <T> List<Map<String, T>> gsonToListMaps(String gsonString) {
List<Map<String, T>> list = null;
if (gson != null) {
list = gson.fromJson(gsonString, new TypeToken<List<Map<String, T>>>() {
}.getType());
}
return list;
}
/**
* json轉成map的
*
* @param gsonString
* @return Map<String , T>
*/
public static <T> Map<String, T> gsonToMaps(String gsonString) {
Map<String, T> map = null;
if (gson != null) {
map = gson.fromJson(gsonString, new TypeToken<Map<String, T>>() {
}.getType());
}
return map;
}
}