片段,什么时候我"活跃"?

Jef*_*man 5 android android-fragments

我一直对此感到沮丧,我找不到一个好的答案,所以希望有人在这里提供指导.

我有一个AsyncTask广泛使用的片段.我一直受到片段调用的错误的困扰getActivity(),它返回null.我假设这些正在发生,因为片段中的某些方法在附加活动之前或分离之后被调用.

在我的代码中处理这个问题的正确方法是什么?我不想让这个成语遍布整个地方,

Activity activity = getActivity();
if (activity != null) { // do something }
Run Code Online (Sandbox Code Playgroud)

看文档的Fragment,我可以想出许多可能钩来解决这个:isDetached(),onActivityCreated(),onAttach(),isResumed(),等.什么是正确的组合?

编辑:

有些人建议在暂停时取消任务,但这意味着标准成语,

new AsyncTask<...>.execute();
Run Code Online (Sandbox Code Playgroud)

不能使用.这意味着每个执行者都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();
}
Run Code Online (Sandbox Code Playgroud)

nha*_*man 2

尝试在onPauseonStop方法中取消您的 AsyncTasks。这将防止当不再活动时(返回)onPostExecute被调用。FragmentgetActivity()null

或者您可以Fragment通过调用this.isAdded()您的Fragment.