在Android的开发过程中,常常需要适时的更新UI。Androd中的UI是在主线程中更新的。如果在主线程之外的线程中直接更新,就会出现报错并抛出异常:

android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

只有原始创建这个视图层次(view hierachy)的线程才能修改它的视图(view)

那么Android中该如何更新UI呢?

1.利用Activity.runOnUiThread(Runnable)把更新UI的代码写在Runnable中

 MainActivity.this.runOnUiThread(new Runnable() {

     @Override
     public void run() {
      // TODO Auto-generated method stub
      char[] str = "Android is intresting...".toCharArray();
      viewText.setText(str, 0, str.length);
     }
    });

2.在Activity.onCreate(Bundle savedInstanceState)中创建一个Handler类的实例,利用Handler的回调实现。

View.post(Runnable)方法。在post(Runnable action)方法里,View获得当前线程(即UI线程)的Handler,然后将action对象post到Handler里。在Handler里,它将传递过来的action对象包装成一个Message(Message的callback为action),然后将其投入UI线程的消息循环中。在Handler再次处理该Message时,有一条分支(未解释的那条)就是为它所设,直接调用runnable的run方法。而此时,已经路由到UI线程里,因此,我们可以毫无顾虑的来更新UI。

 

Handler mHandler=new Handler(); 
     mHandler.post(new Runnable(){ 
        @Override public void run() 
        { // TODO Auto-generated method stub 
        text.....
         } 
     });

 

posted on 2015-01-15 15:51  青年程序猿  阅读(323)  评论(0)    收藏  举报