当应用程序空闲时,将HashMap与对象数据保持在一起 - Android

时间:2015-06-22 04:45:45

标签: android android-activity

我有一个包含与特定活动相关的数据的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");

3 个答案:

答案 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;
    }