長時間実行されている操作中にアクティビティがコンフィグレーションの変更を行った場合、長時間実行されているネットワーク操作を永続化するために、保持されたフラグメントを作成するアクティビティがあります。 。ですから、基本的には、ActivityのonDestroy()が呼び出されるまで、保持されているSingletonのような保持されたフラグメントを使用しようとしています。Androidでデータを設定するonCreate()が呼び出される前のフラグメント
ActivityのonCreate()は、アクティビティが開始されるたびにアクティビティが作成されたときにのみ実行されるため、長時間実行されているネットワークオペレーションをトリガすることです(そうでなければ、onStart
これを行うには、まずActivityのonCreateで保持されたフラグメントを作成し、次にFragmentManagerを使用して保持されているフラグメントを追加し、ActivityのonCreateメソッドでネットワークコールを開始し、保持するFragmentにネットワークオブジェクトを渡します。
何が起こっているのかを記録すると、アクティビティは保持されているフラグメントのデータを最初に設定し、保持されているフラグメントのonCreate()メソッドが呼び出されることがあるためです。これは間違って見え、順不同ですが、うまくいきます。
フラグメントがonCreate()メソッドを実行する前に、保持されているFragmentインスタンスを利用することは悪い習慣ですか?
EDIT 便利なものの、回答を読み、これについてもう少し考えた後、私は)活動のonCreate(からのネットワーク呼び出しを開始することを実現しています、行うのは危険です。応答に記されているように、長時間実行される操作が非常に迅速に戻り、まだ初期化されていないアクティビティのビューを操作しようとする可能性があります。したがって、私の具体的なケースでは、ActivityのonStart()メソッドから長期実行操作を開始し、次にretainFragmentを使用してレスポンスをキャッシュすることに訴えています。このようにして、onStart()が複数回呼び出されて長時間実行される操作を再び開始しようとする場合でも、最初の試行の結果はキャッシュされ、返されます。
長いネットワーク運用を別のサービスで分けることができます。onCreate – Pooya
サービスは解決策ですが、私が試しているものは重いと思われますサービスでも達成するには、何らかのイベントバスを実装して結果を返すか、サービスにバインドする必要があります。そのため、私が避けようとしているものと直接通信できるようになります。私が解決しようとしている問題は、比較的速く終了する非同期操作を開始することですが、(デバイスを回転させるなどの)構成変更に十分な時間があります。 – neonDion
ネットワーク操作は、UIスレッド以外のスレッドで実行する必要があります。そのため、AsyncTaskを使用するか、サービスを使用する必要があります。 onCreateはデバイスをローテーションするたびに呼び出されるため、新しいインスタンスが実行されます。しかし、サービスでは、バックグラウンドで実行され、共有プレビューと共有先広告主を介してサービスと簡単に通信できます – Pooya