2014-03-04 61 views
3

我知道處理程序中聲明的處理程序可能泄漏內存,因爲它擁有對其外部類的引用。在這種情況下,我們應該使用帶有弱引用的靜態嵌套類。將處理方法泄漏內存中嗎?

但是如果一個處理程序是在一個方法內聲明的話。我面臨的情況下,不知道這是否是一個正確的實施。有人可以解釋或給我一個提示嗎?我甚至不知道我應該尋找什麼。

private void methodA(){ 
    Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() {    
     @Override 
      public void run() { 
      methodB(); 
     } 
    }, 10*1000); 

private void methodB(){ 
    //textView holds a reference to a activity 
    textView.setText("hello"); 
} 

回答

2

它可以在一定條件下。如果傳遞的runnable是一個匿名或內部類,就像在你的例子中一樣,它保留對'this'的隱式引用,並且防止'this'被垃圾收集,直到runnable從隊列中被處理(所以如果你的方法永遠不會運行,就像你的處理程序線程在沒有清除隊列的情況下停下來一樣,它會泄漏)。

如果您擔心發生內存泄漏或掛在對象上的時間過長的情況,那麼您需要讓可運行的靜態類在構造函數中具有初始化的弱引用,如下所示:

private static MyRunnable implements Runnable 
{ 
    private final WeakReference<MyClass> myClass_weakRef; 

    public MyRunnable(MyClass myClassInstance) 
    { 
     myClass_weakRef = new WeakReference(myClassInstance); 
    } 

    @Override 
    public void run() 
    { 
     MyClass myClass = myClass_weakRef.get(); 
     if(myClass != null) 
      myClass.methodB(); 
    } 
} 

private void MethodA() 
{ 
    Handler handler = new Handler(); 
    handler.postDelayed(new MyRunnable(this), 10*1000); 
} 
0

在你的方法中創建一個Handler並不是特例。它屬於相同的情況,因爲您發佈的Message將在消息隊列中生存,直到它被處理。

+0

因此,「textView」和活動不能是gc直到消息被處理? –