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

时间:2023-03-08 17:21:08
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
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()
方法二:利用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();   
            }   
      
        });