2016-11-16 15 views
1

長時間実行されている操作中にアクティビティがコンフィグレーションの変更を行った場合、長時間実行されているネットワーク操作を永続化するために、保持されたフラグメントを作成するアクティビティがあります。 。ですから、基本的には、ActivityのonDestroy()が呼び出されるまで、保持されているSingletonのような保持されたフラグメントを使用しようとしています。Androidでデータを設定するonCreate()が呼び出される前のフラグメント

ActivityのonCreate()は、アクティビティが開始されるたびにアクティビティが作成されたときにのみ実行されるため、長時間実行されているネットワークオペレーションをトリガすることです(そうでなければ、onStart

これを行うには、まずActivityのonCreateで保持されたフラグメントを作成し、次にFragmentManagerを使用して保持されているフラグメントを追加し、ActivityのonCreateメソッドでネットワークコールを開始し、保持するFragmentにネットワークオブジェクトを渡します。

何が起こっているのかを記録すると、アクティビティは保持されているフラグメントのデータを最初に設定し、保持されているフラグメントのonCreate()メソッドが呼び出されることがあるためです。これは間違って見え、順不同ですが、うまくいきます。

フラグメントがonCreate()メソッドを実行する前に、保持されているFragmentインスタンスを利用することは悪い習慣ですか?

EDIT 便利なものの、回答を読み、これについてもう少し考えた後、私は)活動のonCreate(からのネットワーク呼び出しを開始することを実現しています、行うのは危険です。応答に記されているように、長時間実行される操作が非常に迅速に戻り、まだ初期化されていないアクティビティのビューを操作しようとする可能性があります。したがって、私の具体的なケースでは、ActivityのonStart()メソッドから長期実行操作を開始し、次にretainFragmentを使用してレスポンスをキャッシュすることに訴えています。このようにして、onStart()が複数回呼び出されて長時間実行される操作を再び開始しようとする場合でも、最初の試行の結果はキャッシュされ、返されます。

+1

長いネットワーク運用を別のサービスで分けることができます。onCreate – Pooya

+0

サービスは解決策ですが、私が試しているものは重いと思われますサービスでも達成するには、何らかのイベントバスを実装して結果を返すか、サービスにバインドする必要があります。そのため、私が避けようとしているものと直接通信できるようになります。私が解決しようとしている問題は、比較的速く終了する非同期操作を開始することですが、(デバイスを回転させるなどの)構成変更に十分な時間があります。 – neonDion

+0

ネットワーク操作は、UIスレッド以外のスレッドで実行する必要があります。そのため、AsyncTaskを使用するか、サービスを使用する必要があります。 onCreateはデバイスをローテーションするたびに呼び出されるため、新しいインスタンスが実行されます。しかし、サービスでは、バックグラウンドで実行され、共有プレビューと共有先広告主を介してサービスと簡単に通信できます – Pooya

答えて

2

私はそれが珍しいことを認めますが、なぜ頭が悪いのか、私の頭の上の理由を考えることはできません。保持されたフラグメントの利点は、フラグメントが破壊されていないことへの参照であるため、それが保持する参照も保持されます。 onCreate()およびonDestroy()は、フラグメントの存続期間中(フラグメントがそれぞれ追加および削除されたとき)に1回呼び出されます。

onCreate()が呼び出される前に非同期操作が終了する危険性があります。同様に、onDestroy()が呼び出された後、そしてフラグメントが実行されることを期待したときに、操作は終了する可能性があります。 Fragment#setArguments()のようないくつかのメソッドがあり、ライフサイクルの一部ではでなく、を呼び出すことができます。 Fragmentが実行されることを期待したときにこれらのメソッドを呼び出すと、例外がスローされます。だから、if(isAttached()) { /* do this */ }のような小切手を入れなければならなくなります。 onCreate()に操作を入れると、操作が完了する前に少なくともが開始してになっていることを確認します。

しかし、実際に機能のいずれにも頼らないのであれば、それは問題ありません。ライフサイクルは、何が起こっているのかを伝えるためのものです。

1

限り断片のonCreate、あなたは罰金になりながら、あなたが利用可能アクティビティ/フラグメントビューに頼っていないよう:フラグメントの活動があることの過程にまだある間、これを呼び出すことができることを

注意作成した。したがって、この時点でアクティビティのコンテンツビュー階層が初期化されているようなことには依存することはできません。

https://developer.android.com/reference/android/app/Fragment.html#onCreate(android.os.Bundle)

はまだ、あなたは(あなたが自分の意見に依存している場合、これは問題になる可能性があります)長時間実行操作が活動する前に終了することができるとフラグメントが完全に作成された可能性エッジケースを固定する必要があります。 したがって、長時間の運用が終了して結果をどこかに提示する必要がある場合は、何をするか考えてください。

関連する問題