2

DialogFragmentクラスによってラップされた警告ダイアログがあります。ダイアログには、項目のリストを表示するカスタム レイアウトがあります (ListView適切なアダプターと共に使用します)。アイテムのリストはかなり巨大で重要なので、この例のようにmyのFragmentクラス内に保存します。DialogFragmentonPause()

非常にまれな状況を除いて、すべてが完全に機能します。ダイアログウィンドウを開いたままにして(「ホーム」ボタンを押して)、デバイスのメモリが少なくなると、アプリのプロセスが強制終了されます。後でアプリケーションに戻ると、ダイアログを再作成しようとしますが、左に開いているダイアログに表示されていた項目のリストを復元できないため、クラッシュします (NullPointerExceptionダイアログのアダプター内に取得します)。ListViewこれはFragment、システムがアプリのプロセスを強制終了すると、ダイアログの状態を保存する も破棄されるDialogFragmentため、リスト アダプターのデータ ソースがないため、ダイアログを再作成できないために発生します。

私があなたに求めているのは、ダイアログ ウィンドウの状態を保存するより良い方法を提供して、アプリ プロセスが強制終了された後でも再作成できるようにすること、またはアイテムのリストがそのnull前にある場合にダイアログをキャンセルする方法を示すことです。再開されます (つまり、ダイアログの再作成中にどこかでダイアログをキャンセルすることを意味します)。時間がかかりすぎるため、データベースはそのデータを保存するための良い方法だとは思いません。アダプターの情報がない場合は、ダイアログの再作成を停止する方法を希望します。

アップデート:

アプリケーションのライフサイクル中にオブジェクトを保存する実装Parcelableは、本当に素晴らしいアイデアです。オブジェクトへの書き込みParcelは高速です (信頼してください。不適切に使用し始めるまで、ライフサイクルの変更の間に遅延は見られません)。また、アプリのインスタンスの状態を保存および復元するプロセスは、ActivityManagerプロセスによって管理されますActivity。また、アプリケーション全体をホストしているプロセスは Android システムによって破棄され、オブジェクトが保存されActivityManagerた場所を維持し、新しいプロセスでゼロから再作成されている場合はその状態を復元します。この練習をするように励ましてくれた@Naveedに感謝します!ParcelActivity

インスタンスの状態を保存することの本当の意味をまだ理解していない人への注意:

ライフサイクル イベントに沿ってインスタンスの状態を保存Activityするということは、アプリケーションの現在の UI またはユーザーの現在の進行状況に対してのみ意味のある情報の変更を維持することを意味しますが、アプリケーションまたはユーザーが明示的にアプリを停止した場合 ([戻る] ボタン) 後で再起動します。実際には一時的なこの特定の形式の情報は、プリミティブ Java 型のメソッドを使用するか、カスタム クラスでインターフェイスを実装することにより、オブジェクトのonSaveInstanceState()コールバック メソッド内に保存し、後でまたはcallbakcs で復元する必要があります。Bundleput...()ParcelableonCreate()onRestoreInstanceState()

ユーザーがアプリケーションを明示的に閉じるか、短時間だけ放置するかに関係なく、ユーザーにとって重要な他のすべてのデータは、SQLiteデータベースやSharedPreferencesシステムなどの永続的なストレージに保存する必要があります。アプリケーションには、以前の進行状況が再び必要です。この形式のデータは、コールバック メソッド内に保存する必要があります。これonPause()は、リソースを回復する必要がある場合にシステムがアプリのプロセスを破棄できるようになる前に呼び出されることが保証されている最後のメソッドであるためです。の後に呼び出されるメソッドでデータを保存することを選択した場合onPause()、つまりonStop()またはonDestroy()、非常に悪い (ただし、必ずしもまれではありません) 場合にシステムがアプリをすぐに強制終了することを決定した場合、これらのメソッドが呼び出されない可能性があるため、データが保存されないという大きなリスクがあります。

SharedPreferences別のこと:リスト、コレクション、またはバンドルを保存するように構築されていないため、少量のデータを保存する場合にのみ使用してください。アプリケーション用のデータベース インターフェイスを実装するのにさらに数時間費やすことを検討し、SQLiteそれをより快適に使用して大量の情報を維持することを検討してください。

4

1 に答える 1

4

onSaveInstanceStateシステムは、メモリの問題のためにアプリを強制終了しようとしているときに呼び出します。状態関連の情報はonSaveInstanceStateに保存できます。データがプリミティブ型、Parcelable、または Serializable の場合、バンドルに保存できます。

アクティビティが再作成されると、フラグメント ライフ サイクルの次のいずれonRestoreInstanceStateかまたは両方で復元できます。onCreate

onCreate(Bundle) called to do initial creation of the fragment.

onCreateView(LayoutInflater, ViewGroup, Bundle) creates and returns the view  hierarchy associated with the fragment. 

onActivityCreated(Bundle) tells the fragment that its activity has    completed its own Activity.onCreate(). 

onViewStateRestored(Bundle)tells the fragment that all of the saved state of its view hierarchy has been restored.

ダイアログを表示したくない場合。次に、null チェックインonResumeを実行し、データが null の場合はアダプターを作成せず、ダイアログが表示されている場合はダイアログを閉じることができます。

更新: パーセル可能な例:

public class MyObject implements Parcelable {

        private String myString;
        private int myInt;

    protected MyObject(Parcel in) {
        myString = in.readString();
        myInt = in.readInt();
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(myString);
        dest.writeInt(myInt);
    }

    @SuppressWarnings("unused")
    public static final Parcelable.Creator<MyObject> CREATOR = new Parcelable.Creator<MyObject>() {
        @Override
        public MyObject createFromParcel(Parcel in) {
            return new MyObject(in);
        }

        @Override
        public MyObject[] newArray(int size) {
            return new MyObject[size];
        }
    };
}
于 2015-05-04T17:22:31.020 に答える