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回调函数中调用更新界面显示的函数。
 
界面:
Android更新UI的两种方法——handler与runOnUiThread()_第1张图片
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); 
                
        
    
}

更新后:

Android更新UI的两种方法——handler与runOnUiThread()_第2张图片
方法二:利用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();   
             }   
      
         });   

你可能感兴趣的:(Android)