private Runnable updateUI = new Runnable() { public void run() { //Do UI changes (or anything that requires UI thread) here } };
Button doSomeWorkButton = findSomeView();
public void onCreate() { doSomeWorkButton.addClickListener(new ClickListener() { //Someone just clicked the work button! //This is too much work for the UI thread, so we'll start a new thread. Thread doSomeWork = new Thread( new Runnable() { public void run() { //Work goes here. Werk, werk. //... //... //Job done! Time to update UI...but I'm not the UI thread! :( //So, let's alert the UI thread: mHandler.post(updateUI); //UI thread will eventually call the run() method of the "updateUI" object. } }); doSomeWork.start(); }); } }
发布评论
评论(4)
上述讲的都是怎么使用的问题。 post() 里面传一个Runnable 就行了,至于是内部类实现还是怎么的,这完全靠个人心得了。 是传Runnable 对象 ,还是发message 信息更新,其实都可以,两种方法,随便上往搜索一下准能出来。
什么情况下使用这两种去更新界面,个人觉得就好经验了。
比如吧 class A exitends Activity 那么在A类中的更新界面的操作你都可以,发message 信息去做, 但是如果你A类中很多子线程之类的 就每一个地方更新的界面的信息都没有统一性,如果写很多message 更新就会显得handMess里面都是一堆乱的东西,那时感觉就只 handler.post() 就好。
还有就是 B 类继承Thread , B 不属于A内部类, 想在B类中弹一个 Toast 啊,等一些简单的UI更新操作 感觉也是 post 来的方便点。
handler.post()并没有新开一个线程啊 只是把runnable放进去而已 这样就可以跟handler都在主线程中 然后就可以更新ui了.其实用sendMessage也可以,只是用sendMessage的话你还需要处理HandleMessage方法,使用runnable直接就把操作写在run方法里就行了。
Handler 为Android操作系统中的线程通信工具,包为android.os.Handler。
Android OS中,一个进程被创建之后,主线程(可理解为当前Activity)创建一个消息队列,这个消息队列维护所有顶层应用对象(Activities, Broadcast receivers等)以及主线程创建的窗口。你可以在主线程中创建新的线程,这些新的线程都通过Handler与主线程进行通信。通信通过新线程调用 Handler的post()方法和sendMessage()方法实现,分别对应功能:
1.post() 将一个线程加入线程队列;
2.sendMessage() 发送一个消息对象到消息队列
当然,post()方法还有一些变体,比如postDelayed()、postAtTime()分别用来延迟发送、定时发送;
消息的处理,在主线程的Handler对象中进行;具体处理过程,需要在new Handler对象时使用匿名内部类重写Handler的handleMessage(Message msg)方法;
线程加入线程队列可以在主线程中也可以在子线程中进行,但都要通过主线程的Handler对象调用post()。
这是一个典型的应用场景,UI线程因为有长时间的工作任务,新启一个线程去完成之后需要将结果返回到ui线程。这个时候因为工作线程无法直接访问ui控件来更新UI,便使用handler去间接通信。
class MyActivity extends Activity {
private Handler mHandler = new Handler();
private Runnable updateUI = new Runnable() {
public void run() {
//Do UI changes (or anything that requires UI thread) here
}
};
Button doSomeWorkButton = findSomeView();
public void onCreate() {
doSomeWorkButton.addClickListener(new ClickListener() {
//Someone just clicked the work button!
//This is too much work for the UI thread, so we'll start a new thread.
Thread doSomeWork = new Thread( new Runnable() {
public void run() {
//Work goes here. Werk, werk.
//...
//...
//Job done! Time to update UI...but I'm not the UI thread! :(
//So, let's alert the UI thread:
mHandler.post(updateUI);
//UI thread will eventually call the run() method of the "updateUI" object.
}
});
doSomeWork.start();
});
}
}
update:
handler和线程的关系请看http://kb.cnblogs.com/a/2351955/