Android性能优化之handler的正确使用与解析
1.什么是Handler
是Android消息机制的上层接口,是一种更新ui的机制。
(Android是线程不安全的,所以能在子线程更新ui,只能执行耗时操作 ,所以要通过handler发送消息更新)
2.Handler实现原理
ThreadLocal:通过不同的线程访问同一个ThreadLocal,无论是ThreadLocal的get或set方法,它们对ThreadLocal的读写操作都仅限于各自线程内部。通过ThreadLocal保存Looper(保证handler中的每个Looper是相互独立的,且不同的线程访问不同的Looper)
Looper是内部管理MessgeQueue的。
每一个handler要与主线程关联上,才可以更新ui。不能在内部类创建handler。这样才能保证ui线程是线程安全。
(就小小的借鉴一下另一位博主的图展示一下handler的流程,个人觉得还是蛮好的)
3.Handler内存泄露问题
产生内存泄露原因:静态内部类持有外部类的匿名使用,导致在用户退出当前Activity时,handler内部的一些耗时操作还在运行,从而导致activity还被handler做引用,最终导致activity还存留在堆栈中,没有被回收,导致内存泄露。
解决:1.handler内部持有外部activity的弱引用。
2.把handler改为静态内部类。
3.在activity的onDestory方法内掉用mHandler.removeCallBack()。
(只能90%的解决)
解决实例:
/** * 解决方式 * * 要解决这种问题,思路就是不适用非静态内部类,继承Handler时,要么是放在单独的类文件中,要么就是使用静态内部类。 * 因为静态的内部类不会持有外部类的引用,所以不会导致外部类实例的内存泄露。 * 当你需要在静态内部类中调用外部的Activity时,我们可以使用弱引用来处理。 * 另外关于同样也需要将Runnable设置为静态的成员属性。 * 注意:一个静态的匿名内部类实例不会持有外部类的引用。 */ private MyHandler mMyHandler = new MyHandler(this); private static class MyHandler extends Handler{ // SoftReference<Activity> 也可以使用软应用 只有在内存不足的时候才会被回收 private final WeakReference<Activity> mActivity; private MyHandler(Activity activity) { mActivity = new WeakReference<>(activity); } @Override public void handleMessage(Message msg) { Activity activity = mActivity.get(); if (activity != null){ //做操作 } super.handleMessage(msg); } } private static final Runnable sRunnable = new Runnable() { @Override public void run() { //做操作 } };
感觉还不错的,点个赞呗