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

[[147881]]
使用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)方法中。
- 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
 - {
 - @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)方法
- 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)方
- 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");
 - }
 - });
 - }
 - }
 
                网站栏目:Android异步更新UI的四种方式
                
                分享地址:http://www.csdahua.cn/qtweb/news35/417685.html
            
网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网