Android 报错:Can't create handler inside thread that has not called Looper.prepare()

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_38184748/article/details/89873690

Android 报错 Can't create handler inside thread that has not called Looper.prepare

描述

这个错误发生在,我在子线程发起网络请求后处理返回的数据时,新建了一个Handler去处理。这是因为新建一个Handler是需要在主线程中,主线程是默认循环的,而子线程则不会。

解决方法

有三种方法吧

1

按照提示在新建Handler前放上一句Looper.prepare();,和之后放上Looper.loop();
使得子线程也开始循环;但是缺点就是子线程就不再会停止并且在闲时释放了。

2

将任务post回到主线程工作
也就是将新建Handler放回到主线程中新建,使用mainHandler.post(mRunable);将任务回调到主线程工作。但是缺点是,如果主线程和子线程不在同一个类文件中,我们就需要传递这个mainHandler到子线程的类文件,耦合高。

3

在子线程中新建一个新线程去完成任务。
由于我的任务是收到短信验证码后,开始倒计时60秒,才给用户再次点击获取验证码,所以我使用了这个方法,新建一个子线程去倒计时就好了。

                // 开始倒计时
                VerifyCodeCountdownTime = LoginConstant.REQ_CODE_TIME;
                // 保存
                DataCache.getInstance().getLoginManager().VerifyCodeCountdownTime = VerifyCodeCountdownTime;
                // 发送通知
                EventBus.getDefault().post(new SuperEvent(LoginTag.VERIFY_CODE_UPDATE_TIME));
                // 每隔1秒更新一下
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        for (int i = LoginConstant.REQ_CODE_TIME; i > 0; i--) {
                            // 如果时间还大于0就继续减
                            VerifyCodeCountdownTime = i;
                            // 保存
                            DataCache.getInstance().getLoginManager().VerifyCodeCountdownTime = VerifyCodeCountdownTime;
                            // 发送通知
                            EventBus.getDefault().post(new SuperEvent(LoginTag.VERIFY_CODE_UPDATE_TIME));
                            // 线程休眠1秒
                            try {
                                Thread.sleep(1000);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                        VerifyCodeCountdownTime = 0;
                    }
                }).start();

完事

猜你喜欢

转载自blog.csdn.net/sinat_38184748/article/details/89873690