私はこれによって絶望的でした。私は良い答えを見つけることができません。フラグメント、いつ私は "アクティブ"ですか?
私はAsyncTask
を非常に広く使用する断片を持っています。私は、フラグメントがgetActivity()
を呼び出し、nullを返すバグに常に悩まされています。私は、アクティビティがアタッチされる前、またはアタッチされた後に、フラグメント内のいくつかのメソッドが呼び出されるため、これらが起こっていると仮定します。
私のコードでこれを正しく処理する方法はありますか? 、isDetached()
、onActivityCreated()
onAttach()
、isResumed()
、と私はFragment
のためのドキュメントを見て
Activity activity = getActivity();
if (activity != null) { // do something }
、このイディオムは、あらゆる場所に散らばっていたくない、私はこの問題を解決するために多くの可能なフックを思い付くことができませんそうです。適切な組み合わせは何ですか?
EDIT:
一時停止したときに少数の人々は、タスクをキャンセル示唆しているが、これは標準イディオム、
new AsyncTask<...>.execute();
が使用できないことを意味します。これは、すべてのexec'd AsyncTask
を完了まで追跡する必要があるか、またはキャンセルする必要があることを意味します。私は単に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();
}
答えは間違いですが...あなたのバグは建築的です。私はあなたがAsyncTasksを使って何をしているのか正確にはわかりませんが、getActivityが実行中にnullを返した場合、AsyncTaskを使用しないでください。タスクで何をしていても、サービスで実行する必要があります。状態の発見を知る必要のあるアクティビティ/フラグメントは、サービスに取得を依頼することができます。 IntentServiceをチェックしてください:AsyncTaskよりも使いやすく、シンプルです(実際はAsyncTaskよりも簡単です**実際は**は**よりも単純ではありません)。 –
@ G.BlakeMeikeはフィードバックに感謝します。私たちは実際には 'IntentService'と' AsyncTask'の両方のパターンをアプリに持っています。私は 'AsyncTask'の呼び出しセマンティクスを大いに好んでいます。再:間違ったアーキテクチャ - 私は同意するか分からない。コンテキストが必要なときはいつでも 'getActivity()'を呼び出さなければなりません。 onPostExecute()内の文字列を取得する必要があるので、私は間違ったアーチを持っていますか? –
まあ、ええ、私はそれがかなり私が言っていると思う。 AsyncTaskの全面的な取り組みは、アクティビティから完全に切り離されたライフサイクルを持つことです。あなたはATの生活の中でいつでも、*どんな*アクティビティ・コンテキストも周りにいるとは信じられません。あなたはATのコンストラクタにApplicationContextを渡すことを考えましたか? –