本文内容简介:
讲解Handler的传递消息的作用,以及多线程相关的知识,以及buddle的使用 |
Handler的简单描述:
1. Handler这个类就是管理某个线程(也可能是进程)的消息队列,比如让Handler处理主线程的消息队列,这样就可以将一些耗时任务放到其他线程之中,待任务完成之后就往主线程的消息队列中添加一个消息,这样Handler的Callback,即handleMessage就会被调用。但是Handler并不是线程安全的,因此官方文档中建议将Handler作为一个静态内部类。
2. 所以Handler只是处理消息,耗时任务放在其他线程。
3. Handler的使用主要是android中无法在主线程(即UI线程)中访问网络、无法在子线程中访问UI线程元素。一般是在子线程中访问网络,然后使用Handler发送message通知主线程处理UI更新操作
- 为多线程的一种方法,实际上Handler和main的线程在一个里面。需要参考第3部分的handler使用才是真正的多线程
- 步骤:
- 创建Handler对象
- 创建Runnable
- 复写runnable中的run,可以加入postdelay
- 使用handler.post(runnable)或者handler.removeCallbacks(runnable)**
Handler handler = new Handler();
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("this is runable!");
handler.postDelayed(runnable, 3000);
}
};
handler.post(runnable);
handler.removeCallbacks(runnable);
- run运行结束则线程死亡
- Thread.currentThread().getId()用于得到当前线程的ID
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
System.out.println(msg.arg1);
}
};
Runnable runnable = new Runnable() {
@Override
public void run() {
Message msg = handler.obtainMessage();
msg.arg1 = 10;
handler.sendMessage(msg);
System.out.println("this is runable!");
handler.postDelayed(runnable, 3000);
}
};
Thread thread = new Thread(runnable);
thread.start();
- Bundle是一种特殊的Map键值对为(string, 其他一般的数据类型-不可以是object)
- 设置启动handlerThread,然后初始化MyHandler对象,最后得到msg并且发送消息
HandlerThread handlerThread = new HandlerThread("demo thread");
handlerThread.start();
MyHandler handler = new MyHandler(handlerThread.getLooper());
Message msg = handler.obtainMessage();
Bundle bundle = new Bundle();
bundle.putInt("age", 20);
msg.setData(bundle);
msg.sendToTarget();
class MyHandler extends Handler
{
MyHandler(Looper looper)
{
super(looper);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Bundle bundle = msg.getData();
System.out.println(" id:"+Thread.currentThread().getId() + " age: " + bundle.getInt("age"));
}
};