Android破坏了全局HashMap

时间:2013-05-31 09:29:11

标签: android activity-lifecycle

我想将一个HashMap添加到singelton(它将是应用程序实例对象)以在活动之间传递数据。我不能使用Bundle,因为对象太大而无法传递意图。

我目前正在使用此实现:

public class MyApp extends Application { 

    private static MyApp singelton;
    private static Map<String, Object> tempDataStorage;

    @Override
    public void onCreate() {
        super.onCreate();
        singelton = this;
        tempDataStorage = new HashMap<String, Object>();
    }

    // puts the object in the Map and returns the key
    public static String putDataInStorage(Object data) {
        String key = UUID.randomUUID().toString() // generate a key
        tempDataStorage.put(key, data);
    }

    // gets the object from the Map and deletes it to save memory
    public static Object getDataFromStorage(String key) {
        Object o = tempDataStorage.get(key);
        tempDataStorage.remove(key);
    }
}

从活动A调用putDataInStorage()以将数据传递给活动B,然后活动B使用通过intent传递的密钥调用getDataFromStorage()。如果活动B被android破坏,它还会在其onSaveInstanceState()方法中调用putDataInStorage()以便稍后回收数据。

如果不使用该应用程序,我仍然会在一段时间后破坏我的应用程序的问题。如果用户然后返回,它似乎使用来自saveInstanceState的Bundle重新创建活动B,而新的HashMap是空的。

我首先考虑在销毁应用程序时将数据从地图写入SQL数据库,然后在娱乐时重新创建对象。但这将导致无休止地增长的Map(以及因此不断增长的内存使用量),因为对象永远不会消失。虽然不是一个好的解决方案。

当从网络服务器获取数据时,我的第二个想法是在活动B的saveInstanceState()中保存对数据的引用(例如,GET请求的参数)。如果活动B然后遇到NullPointerException,它可以重新获取数据。

这是一个很好的解决方案吗?如果没有,最好的是什么? 谢谢你的帮助!

1 个答案:

答案 0 :(得分:2)

您不应指望保存动态数据。当其他应用需要内存时,应用程序可以随时终止。使用SharedPreferences永久保存您的数据。

相关问题