Android UI线程和普通线程的交互

在Android应用启动时会创建主线程(UI线程),UI操作必须在主线程进行。为避免阻塞UI,耗时操作需在子线程中处理,然后通过Handler、Rxbus等手段与主线程交互更新UI。常见的做法是使用Handler发送消息,UI线程的观察者接收到消息后进行界面更新。参考链接提供了详细说明。

 

      当应用启动就会创建一个主线程(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.youkuaiyun.com/figo0423/article/details/79015119,很全面了,但是okhttp的OnResponse回调部分不赞同,因为在回调中是可以直接Toast的,说明还是在主线程里

 

由上可知,核心都是handler,这个Android 消息处理机制,当子线程需要改动UI,都会用handler来实现

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值