当应用启动就会创建一个主线程(UI线程),非UI线程不能修改界面或者重绘界面,UI操作只能在主线程中进行,当有耗时的操作要遵循新开线程处理,这就涉及到了子线程执行完毕或执行的过程中,和主线程交互的问题,常用的方法有如下几点
1. Handler + Rxbus
最简单的场景,子线程中Rxbus发送message,在UI线程的观察者监听中收到消息,重绘UI
//主线程声明
private Handler uiHandler;
//主线程onCreate回调定义
uiHandler = new Handler();
//子线程中
//通知关闭popWindow
RxBus.getDefault().post(RxCode.FACE_BLACK_DISMISS, "");
//UI线程中
Subscription subscription = RxBus.getDefault()
.toObservable(RxBusBaseMessage.class)
.subscribe(new Action1<RxBusBaseMessage>() {
@Override
public void call(RxBusBaseMessage message) {
if (message.getCode() == RxCode.FACE_BLACK_DELETE) {
//发送人脸黑名单删除协议
SendFaceBlackBean sfBean = new SendFaceBlackBean();
sfBean.setFbId(message.getObject().toString());
if (STContext.getInst().pcNumber != null && !STContext.getInst().pcNumber.isEmpty()) {
sfBean.setPcNumber(STContext.getInst().pcNumber);
}
sfBean.setMethod("delete");
viewModel.insertBlack(sfBean, "");
} else if (message.getCode() == RxCode.FACE_BLACK_DISMISS) {
uiHandler.post(new Runnable() {
@Override
public void run() {
/**
更新UI
*/
dismissPop();
}
});
}
}
});
2-7
参考:https://blog.csdn.net/figo0423/article/details/79015119,很全面了,但是okhttp的OnResponse回调部分不赞同,因为在回调中是可以直接Toast的,说明还是在主线程里
由上可知,核心都是handler,这个Android 提供用于更新UI的消息处理机制