泄漏原因:
- 长生命周期对象持有短生命周期对象引用,导致该gc的对象无法释放。(非静态内部类和匿名内部类默认会持有外部类的引用)
解决方案
- 通过程序逻辑来进行保护
1.在关闭Activity的时候停掉你的后台线程。线程停掉了,就相当于切断了Handler和外部连接的线,Activity自然会在合适的时候被回收。
2.如果你的Handler是被Delay的Message持有了引用,那么使用相应的Handler的handler.removeCallbacksAndMessages(null)方法,把消息对象从消息队列移除就行了。
/**
* 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);
}
- 将Handler声明为静态内部类(静态内部类不持有外部类的引用)
private static class MyHandler extends Handler {
WeakReference<Activity > mActivityReference;
MyHandler(Activity activity) {
mActivityReference= new WeakReference<Activity>(activity);
}
@Override
public void handleMessage(Message msg) {
final Activity activity = mActivityReference.get();
if (activity != null) {//一定要盘空,防止弱引用对象被gc
mImageView.setImageBitmap(mBitmap);
}
}