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

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

更新后:

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


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


参考网址:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2013/0302/946.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值