web-dev-qa-db-ja.com

「onRetainCustomNonConfigurationInstance」を使用して、構成の変更後もデータを保持します

私はしばらくの間Androidのプログラミングをしてきましたが、構成の変更時にデータを保持するためのソリューションを探しています。ParcelablesをアクティビティのBundle in onSaveInstanceState docsは、Fragmentフラグをtrueに設定してsetRetainInstanceを使用することを提案しています。

しかし、onRetainCustomNonConfigurationInstanceを使用して任意のオブジェクトを保持するコードに出くわしました(派手な方法ですが、本質的にはActivityなどを参照しない大きなオブジェクトです)。私はこの方法が使われているのを見たことがないので、いくつか疑問があります。

  • このメソッドは、任意のオブジェクトを格納するために呼び出すのが安全ですか(呼び出されることを確信でき、すぐに非推奨/削除されないという意味で)?
  • このメソッドは、Objectを返す必要があるonRetainNonConfigurationInstance()とどのように異なり、本質的には同様に機能するはずですか?
  • 何らかの理由で、保持されたフラグメントを使用する方がさらに優れていますか?

ボーナスとして、AsyncTaskObservable、ビューのプレゼンターなどのオブジェクトの状態を保存して続行するためのその他のヒントや解決策をいただければ幸いです。

23
wasyl

このメソッドは、任意のオブジェクトを格納するために呼び出すのが安全ですか(呼び出されることを確信でき、すぐに非推奨/削除されないという意味で)?

onRetainCustomNonConfigurationInstance()は比較的新しいメソッドであり、非推奨ではありません。削除するだけで何か新しいものを導入する理由がないので、すぐに消えることはないと思います。安全にお使いいただけます。

このメソッドは、Objectを返す必要があるonRetainNonConfigurationInstance()とどのように異なり、本質的には同様に機能する必要がありますか?

onRetainNonConfigurationInstance()は常に、フラグメント、ローダーなどの状態が保持された内部NonConfigurationInstancesクラスのインスタンスを返します。このシステムの動作を変更することはできません(変更しないでください)。そのため、メソッドはfinalであり、オーバーライドすることはできません。

カスタムインスタンスを保持する場合は、onRetainCustomNonConfigurationInstance()をオーバーライドして、そこから返す必要があります。

実際、onRetainNonConfigurationInstance()onRetainCustomNonConfigurationInstance()を呼び出し、保持されたフラグメントやローダーなどの他の状態で再調整されたインスタンスを保持します。

何らかの理由で、保持されたフラグメントを使用する方がさらに優れていますか?

それはむしろあなたのユースケースと好みの問題です。ロジックは次のようになります。アクティビティがフラグメントを制御するだけで、他に特別なロジックが含まれていない場合は、保持されたフラグメントを使用する方が簡単です。アクティビティに保持するものがある場合は、onRetainCustomNonConfigurationInstance()メソッドを安全に使用できます。今のところ、どちらの場合も、状態は古き良き非推奨の onRetainNonConfigurationInstance() メソッドによって保持されます。

p.s.状態の保存に関するボーナスの質問については、 onSaveInstanceState() メソッドを確認することをお勧めします。状態を保存することを目的としていました。

更新:2018年11月5日からのAndroidXリリース 次の注記でメソッドを非推奨にしました:onRetainCustomNonConfigurationInstance は非推奨になりました。 ViewModelを使用して、構成の変更後も存続する必要のあるオブジェクトを格納します。

19