0

アクティビティ間でデータを渡すために、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 に直面した場合、データを再フェッチできます。

それは良い解決策ですか?そうでない場合、より良いものは何ですか?ご協力いただきありがとうございます!

4

1 に答える 1

2

動的データの保存を当てにするべきではありません。他のアプリがメモリを必要とする場合、いつでもアプリケーションを強制終了できます。SharedPreferencesを使用して、データを永続的に保存します。

于 2013-05-31T09:33:28.183 に答える