5

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

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

在我的代码中处理这个问题的正确方法是什么?我不想让这个成语到处乱扔,

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

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

编辑:

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

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

不能使用。这意味着每个 exec 都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();
}
4

3 回答 3

2

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

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

于 2013-02-26T21:11:02.860 回答
1

我找不到一个好的解决方案。总之,要么使用 a Loader,要么在使用它之前检查它getActivity()不返回 null 。我研究过使用Loaders,但该模式对应用程序的结构和数据检索的性质做了很多假设,这对我不起作用。

于 2013-03-18T18:31:15.313 回答
0

在协调生命周期方面,我将onActivityCreated其作为一个心理基准——它标志着底层活动完成它自己的点onCreate。在此之前,我不相信有活动可以getActivity()从。

获取活动返回 null 听起来像是您调用 getActivity() 太早(即在它创建之前)或太晚(即当它停止与片段交互时)。停止您的任务onPause()将阻止 getActivity 返回 null ,因为一旦片段停止与底层活动交互,它将切断任务,因为活动本身已暂停。我认为等待onStop()可能为时已晚,因为如果在底层活动暂停时任务仍在运行,它可能仍然返回 null。

于 2013-02-26T21:27:04.240 回答