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

+0

@ fada21, no. Это то, с чего я начал. Единственное различие между моим вопросом и ответом на http://stackoverflow.com/questions/11278875/handlers-and-memory-leaks-in-android#11336822 заключается в том, что они используют фрагмент вместо активности. –

ответ

3

Если MyThread статический или внешний класс, он не может привести к утечкам. Нет никаких слабых ссылок на деятельность.

2

Это выглядит нормально. Я не вижу ссылки на объект для Activity (WeakRef в порядке, так как это может быть GCed). Я не вижу потенциальных утечек здесь;)

+0

Я был не прав, моя ошибка, извините :) WeakRef + static выглядит нормально, только MyThread и MyHdandler недоступны для GC. – dilix