关于Android中的Handler的一些认识

Handler:Android中用来更新UI的一套机制,也是一套消息处理机制,可以用来发送消息,也可以用来处理消息

Activity的生命周期也是通过Handler来进行消息的传递

Android在设计的时候,就封装了一套消息创建,传递,处理机制,如果不遵循这种机制就没法更新UI信息,就会抛出异常。
用Handler来处理UI的更新问题是为了解决多线程并发的时更新UI所带来的问题


Handler在开发时容易犯的一些错误

不能在非UI线程内更新UI

Handler在创建的时候必须要指定一个Looper对象,在UI线程内创建的Handler,自动关联了系统自动创建的Looper对象。


Handler可以使得App在非UI线程里对UI进行更新,通过sendMessage, sendEmptyMessage, post(Runnable), 等方法。

post方法需要实现Runnable接口,sendMessage方法,需要在handleMessage方法中实现具体内容,传递一个Message实例

Handler通过Callback接口对Message进行拦截,若返回的是true则需要拦截,false则继续执行handlerMessage

private Handler handler = new Handler(new Callback(){
//这是Callback中的handleMessage方法,用来拦截Message
    public boolean handleMessage(Message msg) {
            Toast.makeText(getApplicationContext(), "1", Toast.LENGTH_SHORT).show();
            return false;
        };
    }){
    //这是Handler中的Message方法
        public void handleMessage(Message msg) {
            Toast.makeText(getApplicationContext(), "2", Toast.LENGTH_SHORT).show();
        };
    };

一: Handler封装了消息的发送,(主要包括消息发送给谁)

Looper
1.内部包含一个消息队列也就是MessageQueue, 所有的Handler发送的消息都走向这个消息队列
2.Looper.loop方法,就是一个死循环,不断的从MessageQueue取消息,如果有消息就处理消息,没有消息就阻塞

二: MessageQueue,就是一个消息队列,可以添加消息,并处理消息

三: Handler 也很简单,内部会跟Looper进行关联,也就是说在Handler的内容可以找到Looper,找到了Looper也就找到了MessageQueue,在Handler中发送消息,其实就是向MessageQueue队列中发送消息

总结: Handler负责发送消息,Looper负责接收Handler发送的消息,并直接把消息回传给Handler自己,MessageQueue就是一个存储消息的容器


在子线程中创建一个Handler:
class MyThread extends Thread {
Handler handler;
public void run() {
Looper.prepare();
handler = new Handler(){
public void handlerMessage(Message msg) {};
};
Looper.loop();
};
}

HandlerThread

HandlerThread 可以有效的处理多线程问题,防止线程间的空指针异常。 主要可以用来模拟一个异步的处理,尽量减少在主线程上进行消耗内存多的操作。
HandlerThread 在初始化的时候阻塞着等待Looper的获取,在run方法中唤醒等待的sychronized

Android中更新UI的几种方式: 1.runOnUIThread —-> mHandler.post —-> sendMessageDelayed
2.handler.post —-> sendMessageDelayed
3.handler.sendMessages
4. view.post —-> attachInfo.mHandler.post —-> sendMessageDelayed

Android在onResume()方法中调用ViewRootImp, ViewRootImp类调用方法checkThread()判断是否在UI线程, 调用了这个之后就不能在非UI线程内更新UI

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值