handler的应用场景:
1.to schedule messages and runnables to be executed as some point in the future;
2.to enqueue an action to be performed on a different thread than your own.
第一种是相当于一个定时器,你可以在某个时间点去通过handler执行一个任务。
代码如下:
private Handler handler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
//在这里执行任务
return true;
}
});
handler.sendEmptyMessageDelayed(1,5000); //触发任务执行在5s后
上面我们是在主线程中执行,直接创建handler就可以了,因为loop和消息队列在主线程中已经创建好了,但是如果在子线程想做定时做的事呢?那就得自己创建looper,looper创建的时候消息队列在looper构造中已经创建,下面的代码我们就可以在子线程实现handler定时任务。
@Override
public void run() {
//在这里执行任务
Looper.prepare();
handler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
//在这里执行任务
Log.i(TAG, "aa: "+Thread.currentThread().getName());
return true;
}
});
handler.sendEmptyMessageDelayed(1,5000);
Looper.loop(); //这里注意,loop()是一个死循环,所以后面事不能执行代码的。
}
接下来看第二种应用场景,那就是在不同线程之间互传消息,最常用的就是我们在子线程中执行任务,在主线程中更新ui:
首先在主线程创建handler:
private Handler handler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
return true;
}
});
然后我们就可以从子线程向主线程发送消息了:
new Thread(new Runnable() {
@Override
public void run() {
Message message = handler.obtainMessage();
message.arg1 = 1;
handler.sendMessageDelayed(message, 3000);
}
上面是子线程向主线程发送消息,那么也可以主线程向子线程发送消息,这样的话需要我们在子线程中创建属于子线程的handler,然后在主线程中调用:
@Override
public void run() {
Looper.prepare();
mhandler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
handler.sendEmptyMessageDelayed(3,3000);
return true;
}
});
Looper.loop();
}
然后在主线程中用子线程mhandler发送消息就可以了:
mhandler.sendEmptyMessage(1);
handler最一般应用的场景也就这两种。原理这里不讲了。