[Android UI开发] Android进行异步更新UI的四种方式
来源:互联网 发布:美团数据分析专员 编辑:程序博客网 时间:2024/06/05 11:41
大家都知道由于性能要求,android要求只能在UI线程中更新UI,要想在其他线程中更新UI,我大致总结了4种方式,欢迎补充纠正:
使用Handler消息传递机制;
使用AsyncTask异步任务;
使用runOnUiThread(action)方法;
使用Handler的post(Runnabel r)方法;
下面分别使用四种方式来更新一个TextView。
1.使用Handler消息传递机制
package
com.example.runonuithreadtest;
import
android.app.Activity;
import
android.os.Bundle;
import
android.os.Handler;
import
android.widget.TextView;
public
class
MainActivity
extends
Activity {
private
TextView tv;
Handler handler =
new
Handler()
{
public
void
handleMessage(android.os.Message msg) {
if
(msg.what==
0x123
)
{
tv.setText(
"更新后的TextView"
);
}
};
};
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.tv);
new
MyThread().start();
}
class
MyThread
extends
Thread
{
@Override
public
void
run() {
//延迟两秒更新
try
{
Thread.sleep(
2000
);
}
catch
(InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
handler.sendEmptyMessage(
0x123
);
}
}
}
回到顶部
2. 使用AsyncTask异步任务
注:更新UI的操作只能在onPostExecute(String result)方法中。
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
package
com.example.runonuithreadtest;
import
android.app.Activity;
import
android.os.AsyncTask;
import
android.os.Bundle;
import
android.widget.TextView;
public
class
MainActivity
extends
Activity {
private
TextView tv;
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.tv);
new
Yibu().execute();
}
class
Yibu
extends
AsyncTask<String, String, String>
{
@Override
protected
String doInBackground(String... params) {
try
{
Thread.sleep(
2000
);
}
catch
(InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return
null
;
}
@Override
protected
void
onPostExecute(String result) {
// TODO Auto-generated method stub
tv.setText(
"更新后的TextView"
);
}
}
}
回到顶部
3. 使用runOnUiThread(action)方法
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
package
com.example.runonuithreadtest;
import
android.app.Activity;
import
android.os.Bundle;
import
android.widget.TextView;
public
class
MainActivity
extends
Activity {
private
TextView tv;
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.tv);
new
MyThread().start();
}
class
MyThread
extends
Thread
{
@Override
public
void
run() {
runOnUiThread(
new
Runnable() {
@Override
public
void
run() {
// TODO Auto-generated method stub
try
{
//延迟两秒更新
Thread.sleep(
2000
);
}
catch
(InterruptedException e) {
e.printStackTrace();
}
tv.setText(
"更新后的TextView"
);
}
});
}
}
}
回到顶部
4. 使用Handler的post(Runnabel r)方法
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
package
com.example.runonuithreadtest;
import
android.app.Activity;
import
android.os.Bundle;
import
android.os.Handler;
import
android.widget.TextView;
public
class
MainActivity
extends
Activity {
private
TextView tv;
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.tv);
Handler handler =
new
Handler();
handler.post(
new
Runnable(){
@Override
public
void
run() {
try
{
//延迟两秒更新
Thread.sleep(
2000
);
}
catch
(InterruptedException e) {
e.printStackTrace();
}
tv.setText(
"更新后的TextView"
);
}
});
}
}
0 0
- [Android UI开发] Android进行异步更新UI的四种方式
- android进行异步更新UI的四种方式
- android进行异步更新UI的四种方式
- android进行异步更新UI的四种方式
- android进行异步更新UI的四种方式
- android进行异步更新UI的四种方式
- Android异步更新UI的四种方式
- Android异步更新UI的四种方式
- Android异步更新UI的四种方式
- Android异步更新UI的四种方式
- Android异步更新UI的四种方式
- Android异步更新UI的四种方式
- Android异步更新UI的四种方式
- android进行异步更新UI的四种方式(转载)
- Android开发——异步更新UI的四种方式
- Android更新UI的四种方式
- Android更新UI的四种方式
- Android(进度条)异步更新UI的三种方式
- SQL杂集
- C和C++键盘输入函数总结
- JAVA中super和this调用构造函数
- Dom4j初步使用
- Webservice soap wsdl区别之个人见解
- [Android UI开发] Android进行异步更新UI的四种方式
- LeetCode Find Peak Element
- HTTP协议是无状态协议无链接,怎么理解?
- webim如何使用http长轮询保证消息的绝对实时性
- 黑马程序员-----Java基础-----File,Properties和其他IO处理流
- iOS中Bitcode的介绍及配置
- linux,centous 安装 mongodb
- java之三篇:java的前世今生
- 拉姆达