handler匿名內部類記憶體洩漏優化
阿新 • • 發佈:2019-01-03
直接在Activity中建立匿名內部類的Handler可能會造成記憶體洩漏
當你傳送的訊息沒有處理時,佔據著Activity的應用,當Activity頁面銷燬時,其引用還無法銷燬,產生了記憶體洩漏
解決辦法就是:
1,建立一個靜態的內部類Handler
2,在靜態內部類中弱引用MainActivity
3,在onDestroy()方法中銷燬Handler的訊息佇列中的訊息
有風險的程式碼:
@SuppressLint("HandlerLeak") private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case 0x0001: tvTest.setText("Test"); break; default: break; } } };
優化後的程式碼:
@Override protected void onDestroy() { super.onDestroy(); handler.removeCallbacksAndMessages(null); } private static class MyHandler extends Handler { private WeakReference<MainActivity> weakReference; public MyHandler(MainActivity mainActivity) { weakReference = new WeakReference<>(mainActivity); } @Override public void handleMessage(Message msg) { switch (msg.what) { case 0x0001: weakReference.get().tvTest.setText("Test"); break; default: break; } } }
PS:IDE(Android Studio)會對這種情況進行警告, @SuppressLint("HandlerLeak")註解只是忽略掉並沒有真正解決。正確方法應該是使用弱引用WeakReference。