5

私はこれに常に不満を感じていて、良い答えが見つからないので、ここの誰かがガイダンスを提供してくれることを願っています.

AsyncTask私は非常に広範囲に使用するフラグメントを持っています。私は、フラグメントgetActivity()が null を返す を呼び出すバグに常に悩まされています。アクティビティがアタッチされる前、またはデタッチされた後にフラグメント内のメソッドが呼び出されるため、これらが発生していると思います。

私のコードでこれを処理する正しい方法は何ですか? このイディオムをあちこちに散らかしたくありません。

Activity activity = getActivity();
if (activity != null) { // do something }

のドキュメントを見ると、Fragmentこれを解決するために考えられる多くのフックを思いつくことができます: isDetached()onActivityCreated()onAttach()isResumed()など。正しい組み合わせは何ですか?

編集:

一時停止時にタスクをキャンセルすることを提案する人が何人かいますが、これは標準的なイディオムを意味します。

new AsyncTask<...>.execute();

使用できません。これは、すべての exec'dAsyncTaskを完了まで追跡するか、キャンセルする必要があることを意味します。私は、Google や他の場所のサンプル コードでそれを見たことがありません。何かのようなもの、

private final Set<AsyncTask<?>> tasks = new HashSet<>;
...
AsyncTask<?> t = new AsyncTask<...>() {
  ...
  public void onPostExecute(...) {
    tasks.remove(this);
    ...
  } 
}
tasks.add(t);
t.execute();
...
@Override
public void onPause() {
  for (AsyncTask<?> t: tasks) {
    t.cancel();
  }
  tasks.clear();
}
4

3 に答える 3

2

Try to cancel your AsyncTasks in the onPause or onStop methods. That will prevent the onPostExecute from being called when the Fragment is not active anymore (getActivity() returns null).

Or you could check if the Fragment is attached by calling this.isAdded() in your Fragment.

于 2013-02-26T21:11:02.860 に答える
1

私は良い解決策を見つけることができませんでした。要約すると、 を使用するか、使用する前に null を返さないLoaderチェックを使用してください。getActivity()s の使用を検討しましLoaderたが、このパターンは、アプリの構造とデータ取得の性質について多くの仮定を立てているため、うまくいきませんでした。

于 2013-03-18T18:31:15.313 に答える
0

ライフサイクルを調整するという点では、私onActivityCreatedはメンタル ベンチマークとして保持しています。これは、基礎となるアクティビティが独自のonCreate. それ以前は、からの活動があるとは思いませんgetActivity()

get アクティビティが null を返すということは、getActivity() の呼び出しが早すぎる (つまり、作成される前) か、遅すぎる (つまり、フラグメントとの対話が停止したとき) ように聞こえます。タスクを停止onPause()すると、アクティビティ自体が一時停止されたため、フラグメントが基になるアクティビティとの対話を停止するとタスクが切断されるため、getActivity が null を返すのを防ぐことができます。onStop()基礎となるアクティビティが一時停止したときにタスクがまだ実行されていた場合、それがまだnullを返す可能性があるため、 待機は遅すぎる可能性があると思います。

于 2013-02-26T21:27:04.240 に答える