本文主要总结了Andorid应用中异步更新UI的方法,一共有四种,现在整理出来分享给Android程序员兄弟们,希望给他们的开发工作带来帮助。
大家都知道由于性能要求,android要求只能在UI线程中更新UI,要想在其他线程中更新UI,我大致总结了4种方式,欢迎补充纠正:
- 使用Handler消息传递机制;
- 使用AsyncTask异步任务;
- 使用runOnUiThread(action)方法;
- 使用Handler的post(Runnabel r)方法;
下面分别使用四种方式来更新一个TextView。
1.使用Handler消息传递机制
1 | <span style= "font-size: medium;" > package com.example.runonuithreadtest; |
2 | import android.app.Activity; |
3 | import android.os.Bundle; |
4 | import android.os.Handler; |
5 | import android.widget.TextView; |
6 | public class MainActivity extends Activity { |
7 | private TextView tv; |
8 | Handler handler = new Handler() |
9 | { |
10 | public void handleMessage(android.os.Message msg) { |
11 | if (msg.what== 0x123 ) |
12 | { |
13 | tv.setText( "更新后的TextView" ); |
14 | } |
15 | }; |
16 | }; |
17 | @Override |
18 | protected void onCreate(Bundle savedInstanceState) { |
19 | super .onCreate(savedInstanceState); |
20 | setContentView(R.layout.activity_main); |
21 | tv = (TextView) findViewById(R.id.tv); |
22 | new MyThread().start(); |
23 | } |
24 | class MyThread extends Thread |
25 | { |
26 | @Override |
27 | public void run() { |
28 | //延迟两秒更新 |
29 | try { |
30 | Thread.sleep( 2000 ); |
31 | } catch (InterruptedException e) { |
32 | // TODO Auto-generated catch block |
33 | e.printStackTrace(); |
34 | } |
35 | handler.sendEmptyMessage( 0x123 ); |
36 | } |
37 | } |
38 | }</span> |
2. 使用AsyncTask异步任务
- 注:更新UI的操作只能在onPostExecute(String result)方法中。
1 | <span style= "font-size: medium;" > package com.example.runonuithreadtest; |
2 | import android.app.Activity; |
3 | import android.os.AsyncTask; |
4 | import android.os.Bundle; |
5 | import android.widget.TextView; |
6 | public class MainActivity extends Activity { |
7 | private TextView tv; |
8 | @Override |
9 | protected void onCreate(Bundle savedInstanceState) { |
10 | super .onCreate(savedInstanceState); |
11 | setContentView(R.layout.activity_main); |
12 | tv = (TextView) findViewById(R.id.tv); |
13 | new Yibu().execute(); |
14 | } |
15 | class Yibu extends AsyncTask<String, String, String> |
16 | { |
17 | @Override |
18 | protected String doInBackground(String... params) { |
19 | try { |
20 | Thread.sleep( 2000 ); |
21 | } catch (InterruptedException e) { |
22 | // TODO Auto-generated catch block |
23 | e.printStackTrace(); |
24 | } |
25 | return null ; |
26 | } |
27 | @Override |
28 | protected void onPostExecute(String result) { |
29 | // TODO Auto-generated method stub |
30 | tv.setText( "更新后的TextView" ); |
31 | } |
32 | } |
33 | }</span> |
3. 使用runOnUiThread(action)方法
1 | <span style= "font-size: medium;" > package com.example.runonuithreadtest; |
2 | import android.app.Activity; |
3 | import android.os.Bundle; |
4 | import android.widget.TextView; |
5 | public class MainActivity extends Activity { |
6 | private TextView tv; |
7 | @Override |
8 | protected void onCreate(Bundle savedInstanceState) { |
9 | super .onCreate(savedInstanceState); |
10 | setContentView(R.layout.activity_main); |
11 | tv = (TextView) findViewById(R.id.tv); |
12 | new MyThread().start(); |
13 | } |
14 | class MyThread extends Thread |
15 | { |
16 | @Override |
17 | public void run() { |
18 | runOnUiThread( new Runnable() { |
19 | @Override |
20 | public void run() { |
21 | // TODO Auto-generated method stub |
22 | try { |
23 | //延迟两秒更新 |
24 | Thread.sleep( 2000 ); |
25 | } catch (InterruptedException e) { |
26 | e.printStackTrace(); |
27 | } |
28 | tv.setText( "更新后的TextView" ); |
29 | } |
30 | }); |
31 | } |
32 | } |
33 | }</span> |
4. 使用Handler的post(Runnabel r)方法
1 | <span style= "font-size: medium;" > package com.example.runonuithreadtest; |
2 | import android.app.Activity; |
3 | import android.os.Bundle; |
4 | import android.os.Handler; |
5 | import android.widget.TextView; |
6 | public class MainActivity extends Activity { |
7 | private TextView tv; |
8 | @Override |
9 | protected void onCreate(Bundle savedInstanceState) { |
10 | super .onCreate(savedInstanceState); |
11 | setContentView(R.layout.activity_main); |
12 | tv = (TextView) findViewById(R.id.tv); |
13 | Handler handler = new Handler(); |
14 | handler.post( new Runnable(){ |
15 | @Override |
16 | public void run() { |
17 | try { |
18 | //延迟两秒更新 |
19 | Thread.sleep( 2000 ); |
20 | } catch (InterruptedException e) { |
21 | e.printStackTrace(); |
22 | } |
23 | tv.setText( "更新后的TextView" ); |
24 | } |
25 | }); |
26 | } |
27 | }</span> |