[英]What happens in memory when the Activity is destroyed while its AsyncTask is running?
我一直在玩我創建的應用程序。
活動A(第一個活動)具有一個執行AsyncTask的按鈕。 此AsyncTask的doInBackground()對活動A中的選定值執行計算,其onPostExecute()啟動活動B。
我單擊按鈕,然后在可以開始活動B之前,先按回去銷毀活動A。
該應用程序關閉,然后重新啟動活動B,該活動B由我的AsyncTask的計算填充。
這個很棒的博客解釋了旋轉屏幕時線程的內存泄漏,我在這里通過AsyncTask和后退按鈕按下來應用這些課程。 但是,我還是有些困惑。
按下活動將銷毀它。
我的asynctask在一個已被破壞的活動上運行,由於它正在訪問該活動中的列表元素,因此應拋出NPE。
但事實並非如此。 那么,毀滅到底意味着什么? 我認為這意味着將Activity A引用及其視圖層次結構設置為null,以允許垃圾收集器在某個時間清除它並回收內存。 博客指出沒有,因此內存泄漏。
所以等等,活動A沒有被銷毀嗎? 但我看到它消失了...
到目前為止,這是一個概念性問題,而不是代碼性問題,但應要求:
private class MyAsyncTask extends AsyncTask<ArrayList<Train>, Void, Void> {
protected void onPreExecute() {
// Runs on the UI thread before doInBackground
spinWait.setVisibility(ProgressBar.VISIBLE);
waitMsg.setText("Calculating Schedules....");
spinWait.bringToFront();
waitMsg.bringToFront();
}
@Override
protected Void doInBackground(ArrayList<Train>... lolTrains) {
try {
calcSchedules(lolTrains[0]);
} catch (Exception e) {
Log.d("DEBUG", "Calculating schedules failed, " + e.getMessage());
}
return null;
}
@Override
protected void onPostExecute(Void v) {
// This method is executed in the UIThread
spinWait.setVisibility(View.GONE);
waitMsg.setVisibility(View.GONE);
// if schedules is empty, show error dialog
if (schedules.size() == 0) {
// show msg, etc
} else {
Intent i = new Intent(getBaseContext(), ResultsActivity.class);
i.putExtra("results", schedules);
startActivity(i);
}
}
}
public void MethodInActivityA(View v) {
new MyAsyncTask().execute(memberVarInActivityA);
}
銷毀活動時,並沒有銷毀AsyncTask(基本上是Thread
),您可以嘗試
asyncTask.cancel(true);
在您的onDestroy();
方法
希望這可以幫助
在您的onPostExecute()
,當開始新活動時,請調用finsih()
然后調用startActivity(i)
。 這finish()
內部調用onDestroy
。 在這里,您需要手動清除Asynctask,因為Asynctask是Activity的內部類。 甚至活動被破壞,這個內部類也擁有活動的引用。 您需要通過asyncTask.cancel()
手動清除引用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.