handlemessage
handler:是一个消息分发对象,进行发送和处理消息,并且其 Runnable 对象与一个线程的 messagequeue 关联。
作用:调度消息,将一个任务切换到某个指定的线程中去执行。
为什么需要 Handler?
子线程不允许访问 UI
假若子线程允许访问 UI,则在多线程并发访问情况下,会使得 UI 控件处于不可预期的状态。
传统解决办法:加锁,但会使得UI访问逻辑变的复杂,其次降低 UI 访问的效率。
引入 Handler
采用单线程模型处理 UI 操作,通过 Handler 切换到 UI 线程,解决子线程中无法访问 UI 的问题。
Handler 使用
方式一: post(Runnable)
创建一个工作线程,实现 Runnable 接口,实现 run 方法,处理耗时操作。
创建一个 handler,通过 handler.post/postDelay,投递创建的 Runnable,在 run 方法中进行更新 UI 操作。
new Thread(new Runnable() {
@Override
public void run() {
/**
耗时操作
*/
handler.post(new Runnable() {
@Override
public void run() {
/**
更新UI
*/
}
});
}
}).start();
方式二: sendMessage(Message)
创建一个工作线程,继承 Thread,重新 run 方法,处理耗时操作
创建一个 Message 对象,设置 what 标志及数据
通过 sendMessage 进行投递消息
创建一个handler,重写 handleMessage 方法,根据 msg.what 信息判断,接收对应的信息,再在这里更新 UI。
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) { //判断标志位
case 1:
/**
获取数据,更新UI
*/
break;
}
}
};
public class WorkThread extends Thread {
@Override
public void run() {
super.run();
/**
耗时操作
*/
//从全局池中返回一个message实例,避免多次创建message(如new Message)
Message msg =Message.obtain();
msg.obj = data;
msg.what=1; //标志消息的标志
handler.sendMessage(msg);
}
}
new WorkThread().start();
相关阅读
出处:http://www.cppblog.com/mymsdn/archive/2009/02/19/handle-in-windows.html从广义上,能够从一个数值拎起一大堆数据的东西都
关于DuplicateHandle() 转换伪句柄成真实句柄值的疑问
参考:http://topic.csdn.net/u/20100806/09/f89294ac-fcf7-4a05-bb00-8480c3793ecb.html
Android多线程:HandlerThread详细使用手册
前言 多线程的应用在Android开发中是非常常见的,常用方法主要有:继承Thread类 实现Runnable接口 Handler AsyncTask HandlerThread
看springmvc适配器模式---HandlerAdapter
适配器模式 就是你有一个类接口,但是这个接口不太符合你的预期,如果要用他就需要在他的源码上进行一些修改,这时你可以做一个适配器
Bundle类介绍: Bundle是一个载体,可以存放基本数据类型、对象等内容,相当于一辆汽车,可以装载很多东西,然后运到需要的