我一直對此感到沮喪,我無法找到一個好的答案,所以希望有人能夠提供指導。片段,我什麼時候「活躍」?
我有一個片段,使用AsyncTask
相當廣泛。我經常被那些片段叫做getActivity()
的bug所困擾,它返回null。我認爲這些是因爲片段中的某些方法在附加活動之前或分離之後調用的。
什麼是在我的代碼中處理這個問題的正確方法?我不希望有這個成語散落得到處都是,
Activity activity = getActivity();
if (activity != null) { // do something }
看文檔的Fragment
,我可以想出許多可能鉤到解決這個問題:isDetached()
,onActivityCreated()
,onAttach()
,isResumed()
和等等。什麼是正確的組合?
編輯:
有幾個人建議暫停時取消任務,但是這意味着標準的成語,
new AsyncTask<...>.execute();
不能使用。這意味着每一個exec'd 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();
}
絕對不是答案,但是......你的錯誤是建築。我不知道你在做什麼AsyncTasks,但我可以說,如果getActivity在其中一個運行時返回null,你不應該使用AsyncTask。無論你在做什麼,都應該在服務中完成。需要知道查找狀態的活動/片段可以請求服務獲取。查看IntentService:它比AsyncTask更容易使用並且簡單得多(好吧,現在等待:它比AsyncTask實際上更簡單**是**,不像看起來那麼簡單)。 – 2013-02-26 22:09:33
@ G.BlakeMeike感謝您的反饋。我們實際上在應用中有兩種模式:'IntentService'和'AsyncTask'。我更喜歡'AsyncTask'的調用語義。回覆:錯誤的架構 - 我不知道我是否同意。任何時候你需要一個上下文,你必須調用'getActivity()'。所以需要在onPostExecute()中獲得一個字符串,這意味着我有錯誤的弓? – 2013-02-26 22:32:34
呃..是的,我猜這就是我所說的。與AsyncTask的整個交易是它有一個完全脫離活動的生命週期。在AT的任何特定時間,你都不能指望任何*活動環境。你有沒有考慮過將ApplicationContext傳遞給AT的構造函數? – 2013-02-26 22:36:06