我有一个包含与特定活动相关的数据的HashMap。问题是当应用程序在空闲一段时间后打开时,HashMap为空。我正在获取主活动中的所有数据,并将相应的对象存储在自定义类中的HashMap中。除了应用程序长时间处于空闲状态的某些时候,一切都工作正常,然后HashMap为所有键返回空值。只要我的应用程序的实例正在运行,将数据保存在HashMap中的正确方法是什么?
public class ApplicationCache {
private static ApplicationCache cache;
private static HashMap<String, Object> map;
private ApplicationCache(){
map = new HashMap<String, Object>();
}
public static ApplicationCache getInstance(){
if(cache == null){
cache = new ApplicationCache();
}
return cache;
}
public void setValue(String name, Object value){
map.put(name, value);
}
public Object getValue(String name){
return map.get(name);
}
public void removeValue(String name){
map.remove(name);
}
public void clear(){
map.clear();
}
}
我在主Activity:
中的ListView上的click事件中将对象存储到HashMap中ApplicationCache.getInstance().setValue("details", bankList.get(position));
在另一个活动中,我正在读取此hashmap中的值:
details = (DetailsVO) ApplicationCache.getInstance().getValue("details");
答案 0 :(得分:0)
可能是活动再次加载onCreate()被调用。所以保存状态并恢复它。使用onSaveInstanceState()和onRestoreInstanceState()。让我知道它是否有效。
答案 1 :(得分:0)
我编写了一段简单的代码来优先保存地图并从首选项加载地图。无需GSON功能。我只使用了一个以String作为键,布尔值作为值的映射。
private void saveMap(Map<String,Boolean> inputMap){
SharedPreferences pSharedPref = getApplicationContext().getSharedPreferences("MyVariables", Context.MODE_PRIVATE);
if (pSharedPref != null){
JSONObject jsonObject = new JSONObject(inputMap);
String jsonString = jsonObject.toString();
Editor editor = pSharedPref.edit();
editor.remove("My_map").commit();
editor.putString("My_map", jsonString);
editor.commit();
}
}
private Map<String,Boolean> loadMap(){
Map<String,Boolean> outputMap = new HashMap<String,Boolean>();
SharedPreferences pSharedPref = getApplicationContext().getSharedPreferences("MyVariables", Context.MODE_PRIVATE);
try{
if (pSharedPref != null){
String jsonString = pSharedPref.getString("My_map", (new JSONObject()).toString());
JSONObject jsonObject = new JSONObject(jsonString);
Iterator<String> keysItr = jsonObject.keys();
while(keysItr.hasNext()) {
String key = keysItr.next();
Boolean value = (Boolean) jsonObject.get(key);
outputMap.put(key, value);
}
}
}catch(Exception e){
e.printStackTrace();
}
return outputMap;
}
答案 2 :(得分:0)
我已经编写了这个简单的方法来存储内部文件存储中的对象,你可以使用它,只需用你的Hashmap替换JSONObject
public static void writeToCache(String fileName, JSONObject jObject) {
ObjectOutput out;
try {
if(!(new File(BASE_PATH)).exists()){
new File(BASE_PATH).mkdirs();
}
out = new ObjectOutputStream(new FileOutputStream(
new File(BASE_PATH+fileName)));
out.writeObject(jObject.toString());
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static JSONObject getJsonObject(String fileName) {
ObjectInputStream in;
JSONObject jsonObject = null;
try {
in = new ObjectInputStream(new FileInputStream(new File(BASE_PATH+fileName)));
jsonObject = new JSONObject(in.readObject().toString());
in.close();
} catch (IOException | ClassNotFoundException | JSONException e) {
// TODO Auto-generated catch block
//e.printStackTrace();
return jsonObject;
}
return jsonObject;
}