5

下面是一個示例代碼,這使我有點缺失:活動的實例何時會死?

package com.leak; 

import android.app.Activity; 
import android.app.ProgressDialog; 
import android.os.AsyncTask; 
import android.os.Bundle; 
public class WindowLeakActivity extends Activity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    new LeakThread().execute(); 
} 


class LeakThread extends AsyncTask<Void, Void,Void>{ 

    ProgressDialog dialog; 

    @Override 
    protected void onPreExecute() { 
     dialog=new ProgressDialog(WindowLeakActivity.this); 
     dialog.show(); 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     try { 
      Thread.sleep(2000); 
      finish(); 
      Thread.sleep(2000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     //that would be ok 
     if(WindowLeakActivity.this!=null && !WindowLeakActivity.this.isFinishing()) 
      dialog.dismiss(); 
    } 


}} 

正如你看到的,我創建了一個LeakThread,並完成在doInBackground()方法WindowLeakActivity。

爲了防止泄漏的窗口錯誤,我有),以檢查活動已在onPostExecute(已完成method.That讓我有點missing.I有以下幾個問題:

  1. 是做Activity實例isFinish()檢查onPostExecute是否安全?如果我的Thread類不是Activity的內部類,我必須首先檢查Activity實例是否爲空?
  2. 什麼時候Activity實例會死?作爲Activity的生命週期描述,它會在回調函數onDestroy()時終止,但是Activity的Thread仍然在繼續。儘管它的窗口不可見,但我也可以得到它的實例。
  3. 如果我調用System.gc()。它會收集Activity的實例嗎?

對不起,我的壞描述非常感謝您閱讀我的問題。

+0

我知道這不是答案,但請檢查此:http://commonsware.com/blog/2010/09/10/asynctask-screen-rotation.html你可以在這裏找到非常好的例子如何AsyncTask可以處理所有這些活動問題。 – ania

+0

謝謝。這是一個很好和安全的AsyncTask模板。 – user890973

回答

2

1)通常作爲一項規則,避免使用任何對doInBackground()內的活動的引用。 管理AsyncTask以及活動的生命週期充其量是棘手的。看看this StackOverflow thread關於AsyncTask及其缺陷的良好討論。

2)你不能控制活動的實例何時會死,所以不要依賴它。活動實例的破壞取決於幾個因素,由系統決定。因此,請確保您不要在活動對象本身的範圍之外的任何地方使用對活動的引用。但是,當您的活動的執行即將停止時,您確實收到了回撥,因此請確保您清理那裏的內存。 3)System.gc()更像是對JVM的請求,要求它儘快運行垃圾收集器。看看this thread

從個人經驗來看,我可以告訴你這一點,在使用AsyncTask時儘量避免使用ProgressDialog。管理起來很痛苦,可以很容易地泄漏你的Window對象,只要你的設備配置發生變化就會崩潰應用程序,並且幾乎讓你試圖調試它。我甚至沒有看到Android上的Google應用程序完美地使用ProgressDialog(即使是薑餅即可)。但這只是我的經驗。

+0

非常感謝你的回答!我同意你的觀點。使用ProgressDialog做工作很痛苦。你有什麼好主意而不是使用它嗎? – user890973

+0

ProgressDialog並不全是壞的,它只是我發現使用AsyncTask時不方便使用。嘗試使用ProgressBar,而不是使用ProgressBar,它可以包含在佈局中,然後在處理配置更改時隨後將引用更改爲指向新佈局中的引用。 – Archit