Handler的使用

1、子线程给主线程发送数据,主线程作为接收方,主线程处理数据结果。
    static Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            Loger.e(msg);
        }
    };

    private void test() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                mHandler.sendEmptyMessage(-100);
            }
        }).start();
    }

使用static修改,避免Handler 长期持有Activity,引用内存泄漏。

2、子线程作为接收方,专门接收数据,主线程作为发送端进行数据发送
    Handler mHandler;

    private void test() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                Looper.prepare();
                mHandler = new Handler() {
                    @Override
                    public void handleMessage(Message msg) {
                        super.handleMessage(msg);
                        Loger.e(msg.what);
                    }
                };
                Looper.loop();
            }
        }).start();
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        mHandler.sendEmptyMessage(-100000);
    }
3、内存泄漏

使用Handler 容易出现内存泄漏,这也是常遇到的坑,处理办法:
1)使用static进行修饰,静态成员变量就属于整个进程,避免了一直持有Activity
2)当Activity结束的时候,同时想办法结束子线程,子线程结束自然Handler 代码也结束了
3)因为被延时处理的 message 持有 Handler 的引用,Handler 持有对 Activity 的引用,形成了message – handler – activity 这样一条引用链,导致 Activity 的泄露。在onDestroy()中移除Handler 传递的消息

@Override
public void onDestroy() {
   // 移除所有消息
   handler.removeCallbacksAndMessages(null);
   // 或者移除单条消息
   // handler.removeMessages(what);
}

4)当Handler的代码中需要使用Activity,使用WeakReference对Activity对象进行包装以后传递给Handler使用。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。