在子线程中创建Handler会报错吗?

318 阅读1分钟

问题

下面的代码有问题吗?

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

 

效果

运行代码,我们看看效果

原因

提示在子线程中如果没有调用Looper.prepare()不能创建Handler。为什么会出现下面的现象?

我们看看源码?

我们继续看看Looper.myLooper()的源码

我们可以看到:当我们在子线程中没有调用Looper.prepare(),那么此时在子线程中通过
Looper.myLooper()获得的Looper为null,那么就会抛出异常。

解决办法

子线程中增加 Looper.prepare(); 方法

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