アクティビティ間でデータを渡すために、HashMap をシングルトン (アプリケーション インスタンス オブジェクト) に追加したいと考えています。オブジェクトが大きすぎてインテントを通過できないため、バンドルを使用できません。
私は現在、この実装を使用しています:
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() を呼び出します。アクティビティ B が Android によって破棄された場合、後でデータを再利用するために onSaveInstanceState() メソッドで putDataInStorage() も呼び出します。
アプリが使用されていない場合、しばらくするとAndroidがアプリケーションを破棄するという問題がまだあります。ユーザーが戻ってきた場合、新しい HashMap が空である間に、saveInstanceState からのバンドルを使用してアクティビティ B を再作成するように見えます。
アプリが破棄されたときにマップからデータを SQL データベースに書き込み、再作成時にオブジェクトを再作成することを最初に考えました。ただし、オブジェクトが消えることはないため、マップが際限なく増加します (したがって、メモリ使用量が際限なく増加します)。しかし、良い解決策ではありません。
データは Web サーバーから取得されるため、私の 2 番目のアイデアは、アクティビティ B の saveInstanceState() にデータへの参照も保存することでした (例: GET 要求のパラメーター)。その後、アクティビティ B が NullPointerException に直面した場合、データを再フェッチできます。
それは良い解決策ですか?そうでない場合、より良いものは何ですか?ご協力いただきありがとうございます!