0

我想将 HashMap 添加到单例(将是应用程序实例对象)以在活动之间传递数据。我不能使用 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 使用通过意图传递的密钥调用 getDataFromStorage()。如果 Activity B 被 android 销毁,它还会在其 onSaveInstanceState() 方法中调用 putDataInStorage() 以便稍后回收数据。

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

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

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

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

4

1 回答 1

2

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

于 2013-05-31T09:33:28.183 回答