我想将一个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,它可以重新获取数据。
这是一个很好的解决方案吗?如果没有,最好的是什么? 谢谢你的帮助!