執行的AsyncTask我已閱讀,在Activity
執行AsyncTask
的缺點是任務不更改配置好應付,因爲AsyncTask
的生命週期上沒有Activity
生命週期的束縛。因此,如果任務應更新活動的UI,但同時Activity
由於配置更改而被破壞,AsyncTask
不知道新創建的Activity
的任何內容,因此無法更新它。這也可能導致內存泄漏。在無頭的片段
解決方法建議它使用無頭Fragment
(Fragment
不帶用戶界面),只是爲了執行AsyncTask
,因爲它可以在配置更改後保留。儘管如此,我不理解它是如何可行的,因爲無論如何Activity
及其觀點已被破壞。例如:
public MyFragment extends Fragment {
private SomeAsync myAsync = new SomeAsync();
private WeakReference<View> someActivityView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
public void setActivityView(View View) {
someActivityView = new WeakReference<View>(view);
}
...
class SomeAsync extends AsyncTask<Void, Integer, Object> {
protected Object doInBackground(Void... args) {
...
}
protected void onPostExecute(Object result) {
doUpdate(someActivityView, result);
}
}
}
的someActivityView
是View
屬於Activity
和它被設置爲Fragment
進行更新。 我認爲someActivityView
不會保留在配置更改的情況下,而Activity
再次創建,因此在這種情況下使用無頭Fragment
有什麼好處?
您不應該直接更新活動視圖。創建一個回調並在活動中實現它。現在在片段中使用getActivity()並將其轉換爲回調並使用它。 –