本文主要是介绍Android 报错:Can't create handler inside thread that has not called Looper.prepare(),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Android 报错 Can't create handler inside thread that has not called Looper.prepare
- 描述
- 解决方法
- 1
- 2
- 3
- 完事
描述
这个错误发生在,我在子线程发起网络请求后处理返回的数据时,新建了一个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() {@Overridepublic 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();
完事
这篇关于Android 报错:Can't create handler inside thread that has not called Looper.prepare()的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!