62

構成の変更中に AsyncTask を保持するために Android で保持フラグメントを使用しているときに、これが最善の方法だと思いますが、UI スレッドのメッセージ キューの呼び出し順序についていくつかの疑問が頭に浮かびます。

例: 次のシナリオを想像してください。

  1. 構成変更が発生し、ユーザーがデバイスを回転させます。AsyncTask が実行されています。
  2. フラグメントonDetach()と呼ばれる
  3. AsyncTaskdoInBackground()メソッドの終了
  4. AsyncTaskonPostExecute()が呼び出されます
  5. フラグメントonAttach()と呼ばれる

したがって、UI スレッド メッセージ キューは次のようになります。

キュートップ -> onDetach() | onPostExecute() | onAttach()

私が知る限り、への呼び出しonPostExecute()は構成の変更が完了するまで待機しますが、それはどのように機能しますか? アクティビティ、フラグメントのライフサイクルからの呼び出しは連続して実行されていますか?

4

2 に答える 2

119

構成変更の間および構成変更中onPostExecute()に を呼び出すことはできません。この主張の背後にある理由は 3 つあります。Fragment#onDetach()Fragment#onAttach()

  1. 構成の変更は、メイン スレッドのメッセージ キュー内の単一のメッセージ内で処理されます。

  2. doInBackground()メソッドが戻るとすぐに、メイン スレッドのメッセージ キューにメッセージをポストすることによって、メイン スレッドでメソッドが呼び出されるようにAsyncTaskスケジュールします。onPostExecute()

  3. Activity構成変更のメッセージには、およびFragmentライフサイクル メソッド (onDetach()および など)を呼び出すコードが含まれますonAttach()。のメッセージには、メソッドAsyncTaskを呼び出すコードが含まれます。onPostExecute()メイン スレッドはメッセージ キュー内のメッセージを順次処理するため、2 つのメッセージを同時に実行することはできず、 とのonPostExecute()呼び出しの間に呼び出すことはできません。onDetach()onAttach()

より詳細な説明については、このスレッドのDoug Stevenson への私の回答をお読みください(主張を証明するソース コードへのリンクを含む)。

于 2013-12-25T19:06:52.147 に答える