2014-09-11 43 views
1

我看了文章How to Leak a Context: Handlers & Inner Classes,現在我有一個問題。如果我將mHandler作爲參數傳遞給另一個線程以將消息從該線程發送到主線程,是否會導致內存泄漏?如何泄漏上下文。 MyHandler的一個實例是否會導致泄漏?

SampleActivity

public class SampleActivity extends Activity { 

    /** 
    * Instances of static inner classes do not hold an implicit reference to 
    * their outer class. 
    */ 
    private static class MyHandler extends Handler { 
     private final WeakReference<SampleActivity> mActivity; 

     public MyHandler(SampleActivity activity) { 
      mActivity = new WeakReference<SampleActivity>(activity); 
     } 

     @Override 
     public void handleMessage(Message msg) { 
      SampleActivity activity = mActivity.get(); 
      if (activity != null) { 
       // ... 
      } 
     } 
    } 

    private final MyHandler mHandler = new MyHandler(this); 

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

     // Run a thread (authentication, synchronization, etc.) 
     // Later the user might press the Home button, the Back button, or make a call 
     new MyThread(mHandler).start(); 
    } 
} 

MyThread的

public class MyThread extends Thread { 

    private final Handler handler; 

    public MyThread(Handler handler) { 
     this.handler = handler; 
    } 

    @Override 
    public void run() { 
     // A long operation 

     // I'm done 
     handler.sendEmptyMessage(1); 
    } 

} 
+0

此鏈接可能會有所幫助 - http://stackoverflow.com/questions/11278875/handlers-and-memory-leaks-in-android#11336822 – fada21 2014-09-11 11:17:27

+0

@ fada21,no。這就是我開始的。我的問題和答案之間的唯一區別在於http://stackoverflow.com/questions/11278875/handlers-and-memory-leaks-in-android#11336822它使用片段而不是活動。 – 2014-09-11 11:28:47

回答

3

如果MyThread的是一個靜態或外部類,它不能導致泄漏。沒有任何非弱的活動參考。

2

看起來沒問題。我沒有看到任何鏈接到Activity的對象(WeakRef可以,因爲它可以被GCed)。我沒有看到潛在的泄漏在這裏;)

+0

我不對,我的錯誤,對不起:) WeakRef +靜態似乎沒問題,只有MyThread和MyHdandler無法訪問GC。 – dilix 2014-09-11 12:26:33