私はこれに常に不満を感じていて、良い答えが見つからないので、ここの誰かがガイダンスを提供してくれることを願っています.
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();
}