我一直对此感到沮丧,我找不到一个好的答案,所以希望有人在这里提供指导。
我有一个广泛使用AsyncTask
的片段。我经常受到片段调用getActivity()
的错误的困扰,它返回null。我假设这些事情正在发生,因为片段中的某些方法在附加活动之前或分离之后被调用。
在我的代码中处理这个问题的正确方法是什么?我不想让这个成语遍布整个地方,
Activity activity = getActivity();
if (activity != null) { // do something }
查看Fragment
的文档,我可以提出许多可能的钩子来解决这个问题:isDetached()
,onActivityCreated()
,onAttach()
,isResumed()
,等等。什么是正确的组合?
编辑:
有些人建议在暂停时取消任务,但这意味着标准习语,
new AsyncTask<...>.execute();
无法使用。这意味着每个执行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();
}
答案 0 :(得分:2)
尝试使用onPause
或onStop
方法取消AsyncTasks。这将阻止在onPostExecute
不再处于活动状态时调用Fragment
(getActivity()
返回null
)。
或者,您可以通过在Fragment
中致电this.isAdded()
来查看Fragment
是否已附加。
答案 1 :(得分:1)
回答我自己的问题......
我找不到一个好的解决方案。总之,要么使用Loader
,要么在使用之前检查getActivity()
是否返回null。我研究了使用Loader
,但该模式对应用程序的结构和对我不起作用的数据检索的性质做了很多假设。
答案 2 :(得分:0)
在协调生命周期方面,我将onActivityCreated
作为心理基准 - 它标志着基础活动完成了自己的onCreate
。在此之前,我不相信有getActivity()
的活动。
get活动返回null声音,就像你过早地(即在创建之前)调用getActivity()或者太晚(即它停止与片段交互时)。停止onPause()
中的任务会阻止getActivity返回null,因为一旦片段停止与底层活动交互,它将切断任务,因为活动本身已暂停。我认为等待onStop()
可能为时已晚,因为如果任务在基础活动暂停时仍在运行,它可能仍然会重新生成空值。