子线程创建Handler

朋友跳槽,面试时被问到子线程可以创建Handler吗?对于这个问题,其实我也是有点疑惑,暂且不论子线程创建Handler的应用场景,对于能不能创建这个事情我还是比较好奇的,作为一名爱较真的程序猿,马上打开AndroidStudio写个demo测试。

     new Thread(){
            @Override
            public void run() {
                Handler handler=new Handler();
            }
        }.start();

经过验证直接采用new的方式在子线程中创建Handler会出现错误:”Can’t create handler inside thread that has not called Looper.prepare()。按照提示,应该在new handler()之前,调用Looper.prepare();但是为什么要调用这个方法呢?这个方法又是什么作用呢?看下源码:

    public static void prepare() {
        prepare(true);
    }

    private static void prepare(boolean quitAllowed) {
    //此处保证一个线程只有一个looper
        if (sThreadLocal.get() != null) {
            throw new RuntimeException("Only one Looper may be created per thread");
        }
        sThreadLocal.set(new Looper(quitAllowed));
    }

原来prepare方法为当前的Handler创建了一个新的looper,但是经过尝试,子线程中handler发的消息不能被取到,这是为什么呢?为什么activity中创建的handler就可以被取到?通过查看源码,发现,在主线程中创建的Handler,也拥有looper,而且调用了looper.loop(),开启消息消息处理。于是,我们采用如下方法在子线程中创建Handler

       new Thread(){
            @Override
            public void run() {
                Looper.prepare();
                Handler handler=new Handler(Looper.myLooper());
                Looper.loop();
            }
        }.start();

大功告成。
经过一番思考,恍然大悟,原来子线程创建Handler有着这样的应用场景:子线程中去创建一个Handler,使用这个handler实例在任何其他线程中发送消息,最终处理消息的代码都会在创建Handler实例的线程中运行。
朋友们,喜欢就支持下,如有错误,敬请指正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值