簡體   English   中英

當Activity在其AsyncTask運行時被銷毀時,內存中會發生什么?

[英]What happens in memory when the Activity is destroyed while its AsyncTask is running?

我一直在玩我創建的應用程序。

  1. 活動A(第一個活動)具有一個執行AsyncTask的按鈕。 此AsyncTask的doInBackground()對活動A中的選定值執行計算,其onPostExecute()啟動活動B。

  2. 我單擊按鈕,然后在可以開始活動B之前,先按回去銷毀活動A。

  3. 該應用程序關閉,然后重新啟動活動B,該活動B由我的AsyncTask的計算填充。

這個很棒的博客解釋了旋轉屏幕時線程的內存泄漏,我在這里通過AsyncTask和后退按鈕按下來應用這些課程。 但是,我還是有些困惑。

  1. 按下活動將銷毀它。

  2. 我的asynctask在一個已被破壞的活動上運行,由於它正在訪問該活動中的列表元素,因此應拋出NPE。

  3. 但事實並非如此。 那么,毀滅到底意味着什么? 我認為這意味着將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.

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