Android中的Handler机制
1、Android系统不允许在主线程中执行耗时操作。(activity和service不超过5秒,BoroadcastReceiver组件广播不超过10秒)
2、耗时操作交给工作线程去完成。有时,耗时工作完成后,需要通知主线程/需要更新ui组件,需要有一种机制在主线程和工作现场之间进行通信。这是机制在Android中即为handler机制
3、handler不是另外开启一个线程,他归属于主线程。在主线程中声明和实例化handler对象
4、主/子线程消息传递的机制一般处理步骤(sendMessage/handleMessage的方式)
a) 在主线程中声明和实例化handler对象,重写handleMessage(Message msg)方法。
b)在子线程中,1、构建Message对象(Message对象的构建有两种方式)2、封装数据(最多传两个整型数据,object类型的数据,Bundle类型的数据)3、sendMessage方法将消息传递给主线程
c)在主线程的handleMessage(Message msg)方法中处理消息
5、Message对象的构建有两种方式
a)新建一个Message:Message msg=new Message
b)从消息池中获取一个消息:Message msg=handler.obtainMessage();
推荐使用方法b。原因是不需要重复去新建Message,可以节省内存空间
6、如果有多个子线程向主线程发消息,在主线程中需要判断消息来至于哪个子线程。如何判断呢?-----what值。what可以是一个int值,也可以是封装在Message中what属性
a)只是简单的标识子线程,子线程没有数据传递给主线程可以用:SendEmptyMessage(int 的what)值
b)不仅要标识子线程,而且子线程有数据传递给主线程
Message msg=handler.obtainMessage();
mag.what=1;
mag.obj=.....
c)主线程的判断方式
handleMessage(Message msg)
{
Switch(ms.what)
{
case1:
......
break;
case2:
......
break;
}
}
7、post方式来处理子线程与主线程的通信
a)主线程只需要实例化handler对象
b)子线程中调用post方法,post方法的参数是一个Runnable对象,该对象的run方法实现主线程要做的事情,例如更新ui
public void download(View view) {
num=0;
new Thread(){
@Override
public void run() {
super.run();
while (num<100){
try {
Thread.sleep(3000);
num+=10;
handler.post(new Runnable() {
@Override
public void run() {
//主线程做的
pbprogress.setProgress(num);
tvprogress.setText(num+"%");
}
});
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
}
请多多指教~