Handler的总结
Handler的总结
我们创建的Service。Activity,Broadcast均是一个主线程处理,即UI线程,
但是进行耗时操作时,比如I/O读写的大文件,数据库操作及网络下载需要很长的时间,为了不阻塞用户界面,出现ANR的响应提示窗口,我们可以考虑使用Thread线程来解决
1.对于线程中的刷新一个view为基类的界面,可以使用postInvalidate()方法在线程中处理,其中还提供了一些重写方法比如postInvalidate(int left,int
top,int right,int bottom)来刷新一个举行区域,及延迟操作,比如postInvalidateDelayed(long delayMiliseconds)或postInvalidateDelayed(long delayMiliseconds,int left,int top,int right,int bottom)方法,其中第一个参数为毫秒。
2.推荐用一个Handler来处理这些,可以在一个线程的run()方法中调用handler对象的一个postMessage或sendMessage方法来实现,Android程序内部维护着一个消息队列,会轮流处理这些,
3.Looper:其实Android中每一个Thread都跟着一个Looper,Looper可以帮助Thread维护一个消息队列,但是Looper和Handler没有什么关系,我们从开源代码可以看到Android还提供了一个Thread继承类HandlerThread可以帮助我们处理,在HandlerThread对象中可以通过getLooper来获取Looper对象控制句柄,我们可以将这个Looper对象映射到一个Handler中去实现一个线程的同步机制,Looper对象执行需要初始化looper.perpare方法,同时还要释放资源,使用Looper.release方法。
4.Massage:对于Android中Handler可以传递一些内容,通过Bundle对象可以封装String,Integer和Blob二进制对象,我们通过在线程中使用Handler对吸纳高的sendEmptyMessage或sendMessage方法来传递一个Bundle对象到handle处理器,对于Handler类提供了重写方法handlerMessage(Message msg)来判断,通过msg。what来区分每条信息。将Bundle解包来实现Handler类更新UI线程中的内容实现控件的刷新操作。相关的Handler对象有关消息发送sendXXX相关方法如下,同时还要postXXXX相关方法,一个为发送后直接返回,一个为处理后才返回。
5.在Android中还提供了一个Task及AsyncTask处理方式
6.线程:
new Thread(
new Runabler(){
public void run(){
view.invalidate();
}
}
).start();
7.Thread+handler:
Handler myHandler=new Handler(){
public void handleMessage(Message msg){
switch(msg.what){
case TestHadler.GUIUPDATEIDENTUFIER:
view.invalidate();
}
}
super.handlerMessgae(msg);
};
class myThread implement Runable{
public void run(){
while(!Thread.currentThread().isInterrupted() ){
Message messgae=new Message();
message.what=TestHandler.GUIUPDATEIDENTUFIER;
TestHandler.this.myHandler.sentMessage(message);
try( Thread.sleep(100); ){
catch(){}
}
}
}
}
8.TimerTask+Handler:
public class TestTimer extends Activity(){
Timer timer=new Timer();
Handler handler=new Handler(){
public void handleMessage(Message msg){
switch(msg.what){
case 1: setTitle("123");
break;
}
super.handleMessage(msg);
}
};
TimerTask task=new TimerTask(){
public void run(){
Message msg=new Message();
msg.what=1;
handler.senMessage(msg);
}
};
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInsanceState);
setContenView(R.layout.main);
timer.schedule(task,10000);
}
}
9.Runable+Handler.postDelayed(runable,time) :在Android里定时更新UI,通常使用的时java.util.Timer ,java.util.TimerTask ,android.os.Handler 组合,实际上Handler自身已经提供了定时的功能。
privae Handler handler=new Handler();
priavte Runable myRunable=new Runable(){
public void run(){
if(run){
handler.postDelayed(this,1000);
count++;
}
tvCounter.setText("count:"+count):
}
};
然后再其他地方调用:
handler.post(myRunable);
handler.post(myRunable,time);
案例看:http://shaobin0604.javaeye.com/blog/515820