2014-09-11 45 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