版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_38184748/article/details/89873690
描述
这个错误发生在,我在子线程发起网络请求后处理返回的数据时,新建了一个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();