Android开发经常会用到handler,但是我们发现每次使用Handler都会出现:This Handler class should be static or leaks might occur(null)这样的提示。Android lint就是为了提示我们,这样使用Handler会容易造成内存泄漏。但是你会发现其实改成static并没有什么用。因为这并没有解决这个问题的根本。
因为Handler是基于消息的。每次new 出Handler,都会创建一个消息队列用于处理你使用handler发送的消息。正常消息还好,延时消息有很大可能造成内存泄漏。举个例子,我在一个activity里给他的handler发送延时消息,在没有设置横竖屏切换不新建的情况下使劲的横竖屏切换。
public class DemoActivity extends Activity {
private Handler mHandler;
protected void onCreate(Bundle savedInstanceState) {
mHandler = new Handler();
mHandler.postDelayed(new Runnable() { Log.i(" DemoActivity ","-----------postDelayed-------"); }, 50000);
}
}
看一下源码,不管你post的是Runnable还是正常Message或者EmptyMessage,最后都是Message放入消息队列里面。
所以我们直接在onDestroy中调用一下回收
handler.removeCallbacksAndMessages(null);
网友评论