Handler 提供了异步处理任务的机制。在任务线程队列的对头获取执行任务,在任务队列线程的队伍放入任务线程。
线程队列
消息队列
handler.post(Runnable thread)执行的任务是在主线程中执行的。并没有启动新的线程。只调用了线程的run方法,没有调用start方法。
一:线程队列处理:
是一个任务线程的执行队列。
//handler接收到任务线程,放到任务队列里面派对执行。
//调用该任务线程的run() 方法执行任务线程。
Handler updateBarHandler =new handler();
handler.post(Runnable Thread);
//移除handler里的任务线程,调用线程的stop()方法,销毁线程。
handler.removecallbacks(Runnable Thread);
二:消息队列处理
1.定义Handler的接收消息监听方法
Handler updateBarHandler =new handler(){
//覆写handleMessage方法,用于接受消息队列的信息
@Override
public void handleMessage(Message msg){
bar.setProgress(msg.arg1);
updateBarHandler.post(Runnable thread);
}
}
2.发送消息sendMessage arg1 arg2
//获取handler的消息对象,方法是有Android操作系统提供的。消耗比较小。
Message msg=updateBarHandler.obtainMessage();
//用msg对象的arg参数设置值,来传递信息。
//msg.obj=obj 传送一个对象
//msg.setDate(Bundle bundle); 传送大的数据对象 Bundle的是Key值固定的映射表。
一下是用handler完成的进度条处理的代码片段:
1.定义handler
Handler updateBarHandler =new handler(){
//覆写handleMessage方法,用于接受消息队列的信息
@Override
public void handleMessage(Message msg){
bar.setProgress(msg.arg1);
updateBarHandler.post(Runnable thread);
}
}
2定义线程任务:
Runnable updateThread =new Runnable(){
int i=0;
@Override public void run(){
i=i+10;//进度条每次前进是各单位
Message msg=updateBarHandler.obtainMessage();
msg.arg1=i;
try{
Thread.sleep(1000);
}catch(){
;}
updatebarhandler.sendMessage(msg);
if(i==100)//进度条的默认值是100
updateBarhandler.removeCallbacks(updateThread);
}
}
HandlerThread 可以实现另起一个线程去做任务
//实现了使用Looper来处理消息队列的功能。由android的操作系统提供。可以循环调用的任务。
Oncreate(){
Handlerthread handlerThread =new HandlerThread("thread_name")
handlerThread.start();//来启动一个新的线程。
Myhandler myHandler=new Myhandler(handlerThread.getLooper);//是该handler运行时可以搭载在已经启动的线程之上。
//将msg发送到生成该msg的目标对象handler中,会触发该对象的handlerMessage()方法。
Message msg=myhandler.obtainMessage();
msg.sendTotarget();
}
//自定义handler类
class Myhandler extends handler{
public Myhandler(){
}
public Myhandler(Looper looper){
super(looper);
}
@Override
public void handlerMessage(Message msg){
System.out.println("handler--->"+Thread.currentThread.getId());
}
}