本文主要总结了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> |