-
-
内部类引用导致Activity的泄漏:
- 最典型的场景是Handler导致的Activity泄漏,如果Handler中有延迟的任务或者是等待执行的任务队列过长,都有可能因为Handler继续执行而导致Activity发生泄漏。此时的引用关系链是Looper -> MessageQueue -> Message -> Handler -> Activity。为了解决这个问题,可以在UI退出之前,执行remove Handler消息队列中的消息与runnable对象。或者是使用Static + WeakReference的方式来达到断开Handler与Activity之间存在引用关系的目的。
-
Activity Context被传递到其他实例中,这可能导致自身被引用而发生泄漏:
- 内部类引起的泄漏不仅仅会发生在Activity上,其他任何内部类出现的地方,都需要特别留意!我们可以考虑尽量使用static类型的内部类,同时使用WeakReference的机制来避免因为互相引用而出现的泄露。
-
- 考虑使用Application Context而不是Activity Context;
- 解决办法:
package com.example.jiangwei18.myapplication; import android.animation.ObjectAnimator; import android.animation.TypeEvaluator; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.animation.Interpolator; import android.widget.Button; import android.widget.ListView; import android.widget.Toast; import java.lang.ref.WeakReference; public class MainActivity extends Activity { private ListView lv; private final MyHandler handler = new MyHandler(this);; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); handler.sendEmptyMessageDelayed(0, 4000); } public static class MyHandler extends Handler{ WeakReference<MainActivity> mActivity; public MyHandler(MainActivity activity){ mActivity = new WeakReference<>(activity); } @Override public void handleMessage(Message msg) { MainActivity mainActivity = mActivity.get(); Toast.makeText(mainActivity, "hello", Toast.LENGTH_LONG).show(); super.handleMessage(msg); } } @Override protected void onDestroy() { handler.removeCallbacksAndMessages(null); super.onDestroy(); } }
- (1)static+WeakReference方式
- (2)
/** * Remove any pending posts of callbacks and sent messages whose * <var>obj</var> is <var>token</var>. If <var>token</var> is null, * all callbacks and messages will be removed. */ public final void removeCallbacksAndMessages(Object token) { mQueue.removeCallbacksAndMessages(this, token); }