3

私は Android アプリを開発していますが、同じエクストラを使用して同じアクティビティから取得された場合に、同様のデータをリロードすることを避けたいと考えています。

具体的には、エクストラでアクティビティ「A」を起動すると、このエクストラを使用してサーバーからリモートデータをロードします。このアクティビティから、別のエクストラなどで「A」を再起動できます。

例 :

A:id1 --> A:id2 --> A:id3

しかし、それは私がすでにロードした余分なものでもあります:

A:id1 --> A:id2 --> A:id3 --> A:id1

この場合、サーバーに再度リクエストしたり、アクティビティ スタックを失ったりすることはありません。

私が理解しているように、「onSaveInstanceState」は1つのアクティビティの1つのインスタンスを保存できますが、私の場合、同じアクティビティの複数のインスタンスです(異なるエクストラを使用)。

では、同じ Activity に対して保存されたインスタンスの状態 (バンドル) のリストを管理するのが解決策ですか? または、他の何か ?

前もって感謝します

4

2 に答える 2

3

onSaveInstanceStateメソッドは、あなたが説明した方法では使用されません 。これを確認してください。これはアクティビティ クラス、特にアクティビティ ライフサイクル セクションのドキュメントです。 onSaveInstanceStateOS が何らかの理由でアクティビティを強制終了する必要があるときに呼び出されるメソッドです。これにより、ユーザーが中断したアクティビティの特定のインスタンスを再作成するのに役立つバンドルを設定できます。通常、これはユーザーが別のアプリに切り替え、OS がメモリを再利用するためにアクティビティを強制終了しているために発生しますが、画面の回転でも発生するため、プラットフォームの微妙な違いに注意する必要があります。

あなたの質問については、サーバーから取得した情報をデータベースに保存することです。アクティビティを開始すると、まず、そのアクティビティに入力する必要があるデータがデータベースに存在するかどうかを確認できます。存在する場合は、そこからロードして表示し、そうでない場合はサーバーを呼び出します。

アプリを複数回使用してもデータが保持されるため、これは便利です。さらに、サーバーからのデータが古くなる可能性がある場合は、これを簡単に拡張してデータベースからのデータを最初に表示し、返されたときに UI とデータベースの両方を更新するデータの非同期要求を開始できます。 . ユーザーが読み込みを待っている状態になることはほとんどありません。これは常に良いことです。

これは、sqlite データベースの実装の基本に関する優れたチュートリアルです。これにより、アプリケーションを個別に実行してデータを保存しておくという追加の利点も得られます。

別の方法として、データベースの永続性やその他の機能が本当に必要なく、オーバーヘッドがそれだけの価値があるとは思わない場合は、返されたデータを追跡する Singleton クラスを作成し、おそらくそれを実装することができますApplication クラスを使用します。onSaveInstanceStateアクティビティが予期しない時間に強制終了された場合にデータが失われないように、このデータをメモリ内に格納する方法を管理する必要があることに注意することが重要です (そして完全な循環をもたらします) 。

于 2013-02-08T15:29:39.150 に答える
0

+1 MattDavis の回答ですが、「シングルトン パターン」と呼ばれるものを使用することもお勧めします。

基本的に、これはメモリにキャッシュする方法です。リロードし続けたくないデータベースデータをすべて保持することを目的としたクラスを作成します。このオブジェクトには単一のグローバル インスタンスがあり、最初は null です。そのインスタンスを返す静的メソッドを呼び出します。静的メソッドは、インスタンスが null であることを検出すると、インスタンスを作成し、データベースから移入してキャッシュし、呼び出し元に返します。その時点から、インスタンスに対するすべてのリクエストは、キャッシュされたコピーを返すだけです。リソース不足のためにアプリがシステムによって強制終了され、後で再起動された場合、必要に応じて透過的にインスタンスを再作成します。

これは非常に一般的な実装で、マルチスレッド環境で動作します。

public class Singleton {
    private static volatile Singleton instance = null;
    private Singleton() {
        // This is the place where you initialize the instance
        // from the database.
    }
    public static Singleton getInstance() {
        if (instance == null) {
            synchronized(Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

私はこのパターンを多くの場所で使用しています。とても便利です。

本当に正しく行うには、アクティビティに onLowMemory () または onTrimMemory () を実装リソースが逼迫したときにシングルトン インスタンスを解放する必要があります。

于 2013-02-08T18:51:31.943 に答える