Android 更新UI的两种方法——handler和runOnUiThread()

转于:http://blog.csdn.net/luckyjda/article/details/8601517

-------------------------------------------------------------------------------------------------------------

在Android开发过程中,常需要更新界面的UI。而更新UI是要主线程来更新的,即UI线程更新。如果在主线线程之外的线程中直接更新页面显示常报错。抛出异常:android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

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

话不多说,贴出下面的代码

方法一:

在Activity.onCreate(Bundle savedInstanceState)中创建一个Handler类的实例, 在这个Handler实例的handleMessage回调函数中调用更新界面显示的函数。


界面:


[html] view plain copy
  1. <span style="font-size:14px;">public class MainActivity extends Activity {  
  2.     private EditText UITxt;  
  3.     private Button updateUIBtn;  
  4.     private UIHandler UIhandler;  
  5.   
  6.     @Override  
  7.     public void onCreate(Bundle savedInstanceState) {  
  8.         super.onCreate(savedInstanceState);  
  9.         setContentView(R.layout.activity_main);  
  10.         UITxt = (EditText)findViewById(R.id.ui_txt);  
  11.         updateUIBtn = (Button)findViewById(R.id.update_ui_btn);  
  12.         updateUIBtn.setOnClickListener(new View.OnClickListener() {  
  13.               
  14.             public void onClick(View v) {  
  15.                 // TODO Auto-generated method stub  
  16.                 UIhandler = new UIHandler();  
  17.                 UIThread thread = new UIThread();  
  18.                 thread.start();  
  19.             }  
  20.         });  
  21.     }  
  22.   
  23.     @Override  
  24.     public boolean onCreateOptionsMenu(Menu menu) {  
  25.         getMenuInflater().inflate(R.menu.activity_main, menu);  
  26.         return true;  
  27.     }  
  28.     private class UIHandler extends Handler{  
  29.         @Override  
  30.         public void handleMessage(Message msg) {  
  31.             // TODO Auto-generated method stub  
  32.             super.handleMessage(msg);  
  33.             Bundle bundle = msg.getData();  
  34.             String color = bundle.getString("color");  
  35.             UITxt.setText(color);  
  36.         }  
  37.     }  
  38.     private class UIThread extends Thread{  
  39.         @Override  
  40.         public void run() {  
  41.             try {  
  42.                 Thread.sleep(3000);  
  43.             } catch (InterruptedException e) {  
  44.                 // TODO Auto-generated catch block  
  45.                 e.printStackTrace();  
  46.             }  
  47.             Message msg = new Message();  
  48.             Bundle bundle = new Bundle();  
  49.             bundle.putString("color", "黄色");  
  50.             msg.setData(bundle);  
  51.             MainActivity.this.UIhandler.sendMessage(msg);  
  52.               
  53.         }  
  54.     }  
  55. }</span>  

更新后:

方法二:利用Activity.runOnUiThread(Runnable)把更 新ui的代码创建在Runnable中,然后在需要更新ui时,把这个Runnable对象传给 Activity.runOnUiThread(Runnable)。 这样Runnable对像就能在ui程序中被调用。如果当前线程是UI线程,那么行动是立即执行。如果当前线程不是UI线程,操作是发布到事件队列的UI 线程

[html] view plain copy
  1. FusionField.currentActivity.runOnUiThread(new Runnable()    
  2.         {    
  3.             public void run()    
  4.             {    
  5.                 Toast.makeText(getApplicationContext(), , "Update My UI",    
  6.                         Toast.LENGTH_LONG).show();    
  7.             }    
  8.     
  9.         });   

猜你喜欢

转载自yuemeiqing2008-163-com.iteye.com/blog/2034202