Будет ли этот обработчик по-прежнему пропускать контекст?

Я знаю, что если вы инициализируете Handler напрямую и используете его в Activity, произойдет утечка Context (любезно предоставлено Алекс Локвуд), например

public class SampleActivity extends Activity {

  private final Handler mLeakyHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
      /* ... */
    }
  }
}

Поэтому я использовал следующий подход

private static class StaticHandler extends Handler {

    private final WeakReference<SampleActivity> mSampleAct;

    private StaticHandler(SampleActivity act) {
        mSampleAct = new WeakReference<SampleActivity>(
                act);
    }

}

Затем я инициализирую его следующим образом

 public class SampleActivity extends Activity {
    private Handler myHandler = new StaticHandler(this) {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            processTask(msg.obj);
        }
    };
}

Я хотел знать, будет ли мой Handler, т. е. myHandler, по-прежнему пропускать Context, как я могу быть уверен, что это не так?


person Arif Nadeem    schedule 28.02.2013    source источник


Ответы (1)


Использование WeakReference определенно является разумным способом избежать утечек памяти. Код выглядит хорошо вне контекста, но лучший способ убедиться, что он не приведет к утечке памяти, — это использовать анализатор памяти DDMS. Подробнее: Memory Analyzer Tool в Android?

person Phil    schedule 28.02.2013