![](/img/trans.png)
[英]Fragments overlapping when I am using fragmentTransaction.add method
[英]fragments, when am i “active”?
我一直對此感到沮喪,我找不到一個好的答案,所以希望有人在這里提供指導。
我有一個非常廣泛使用AsyncTask
的片段。 我經常被片段調用getActivity()
的bug所困擾,它返回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();
}
嘗試在onPause
或onStop
方法中取消AsyncTasks。 這將阻止在Fragment
不再處於活動狀態時調用onPostExecute
( getActivity()
返回null
)。
或者你可以檢查Fragment
是通過調用連接this.isAdded()
在你的Fragment
。
回答我自己的問題......
我找不到一個好的解決方案。 總之,要么使用Loader
,要么在使用之前檢查getActivity()
是否返回null。 我研究了使用Loader
,但該模式對應用程序的結構和數據檢索的性質做了很多假設,這對我來說並不適用。
在協調生命周期方面,我將onActivityCreated
作為心理基准保持 - 它標志着基礎活動完成了自己的onCreate
。 在此之前,我不相信getActivity()
的活動。
get活動返回null聲音,就像你太早(即在創建之前)調用getActivity()或太晚(即它停止與片段交互時)。 在onPause()
停止任務會阻止getActivity返回null,因為一旦片段停止與底層活動交互,它將切斷任務,因為活動本身已暫停。 我認為等待onStop()
可能為時已晚,因為如果任務在底層活動暫停時仍在運行,它可能仍然會重新生成空值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.