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() {
        //做操作
    }
};
 
 

感觉还不错的,点个赞呗微笑

猜你喜欢

转载自blog.csdn.net/qq_33429583/article/details/79942973