Android 解决非UI线程操作UI的两种办法 :Handler 和 AsynTask

在Android中,当应用启动,系统会创建一个主线程(main thread)。

主线程主要负责处理与UI相关的事件,如用户的按键事件,用户接触屏幕的事件以及屏幕绘图事件,并把相关的事件分发到对应的组件进行处理。
main thread 也叫UI线程。

系统不会为每个组件单独创建线程,在同一个进程里的UI组件都会在UI线程里实例化,系统对每一个组件的调用都从UI线程分发出去。

Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行。且 UI 主线程不允许其他线程来操作UI组件(主要包含:android.widget and android.view

为此,Android提供了两种解决办法:
Handler 和 AsynTask

单线程模式 : Handler

在单线程模型下,为了解决类似的问题,Android设计了一个Message Queue(消息队列), 线程间可以通过该Message Queue并结合Handler和Looper组件进行信息交换。(在Android系统中提供了一系列方便的类来管理线程——Looper用来在一个线程中执行消息循环,Handler用来处理消息)下面将对它们进行分别介绍:

Message:是指子线程将需要更新UI的信息发送到Message Queue当中。

Handler : 是指主要对Message进行处理。负责Message的发送,Message内容的执行处理。后台线程就是通过传进来的Handler对象引用来sendMessage(Message)。而使用Handler,需要实现该类的 handleMessage(Message) 方法,它是处理这些Message的操作内容,例如Update UI

Message Queue:用来存放通过Handler发布的消息,按照先进先出执行。 每个message queue都会有一个对应的Handler。Handler会向Message Queue通过sendMessage()方法发送消息

需要注意的地方:在Android当中,系统会自动给UI主线程建立Message Queue,而子线程系统不会为其创建。所以子线程发给主线程的消息时,looper不会为null,而反过来有可能为null。所以在子线程当中必须声明:Looper.prepare和Looper.loop , 在这两者之间就相当于一个Message Queue

    private Handler mHandler;
    class MyThread extends Thread{
        @Override
        public void run() {
            Looper.prepare();
            mHandler=new Handler(){
                @Override
                public void handleMessage(Message msg) {
                    //处理接收到的消息
                    Log.d("Handler","接收到主线程发来的消息");
                }
            };
            Looper.loop();
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值