您的位置:首页 > 移动开发 > Android开发

关于Android中的Handler的一些认识

2015-03-23 21:27 651 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android Handler