Android开发——异步更新UI的四种方式

本文主要总结了Andorid应用中异步更新UI的方法,一共有四种,现在整理出来分享给Android程序员兄弟们,希望给他们的开发工作带来帮助。

大家都知道由于性能要求,android要求只能在UI线程中更新UI,要想在其他线程中更新UI,我大致总结了4种方式,欢迎补充纠正:

  1. 使用Handler消息传递机制;
  2. 使用AsyncTask异步任务;
  3. 使用runOnUiThread(action)方法;
  4. 使用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>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值