(转)Android更新UI的两种方法——Handler与runOnUiThread()

原地址:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2013/0302/946.html


在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回调函数中调用更新界面显示的函数。
 
界面:
  
  
  1. 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. }

更新后:

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


 
 
  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.         });

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值