簡體   English   中英

片段,什么時候我“活躍”?

[英]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();
}

嘗試在onPauseonStop方法中取消AsyncTasks。 這將阻止在Fragment不再處於活動狀態時調用onPostExecutegetActivity()返回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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM