android跨线程更新UI的三种方法

本文介绍了一种在Android应用中实现多线程并更新UI的方法。主要探讨了三种技术方案:使用runOnUiThread()方法、按钮控件自身的post()方法以及使用Handler类。此外还详细介绍了如何利用AsyncTask类来实现异步任务处理,并展示了具体的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

案例运行效果:

跨线程更新UI,进度条使用 跨线程更新UI,进度条使用

直接启动一个线程:new Thread()

关键代码:
使用runOnUiThread类

runOnUiThread(new Runnable() {
public void run() {
progressBar.setProgress(progress);
button.setText("正在下载...当前下载进度是:"+progress+"%");
}
});

或者使用按钮控件自身方法:

button.post(new Runnable() {

                            @Override
                            public void run() {
                                button.setText("下载完毕");

                            }
                        });

或者延时地更新按钮内容

button.postDelayed(new Runnable() {

                            @Override
                            public void run() {
                                button.setText("下载完毕!");

                            }
                        }, 5000);
                    };

新建一个类,继承AsyncTask

重写AsyncTask的三个方法
doInBackground(String… arg0)
onPostExecute(Object result)
onProgressUpdate()

然后在主线程里面使用
new DownloadTask().execute();

使用handler类

handler工作流程

一条 Message经过这样一个流程的辗转调用后,也就从子线程进入到了主线程,从不能 更新 UI变成了可以更新 UI

在handler类中重写handleMessage(Message msg)方法
判断msg.what的值决定是否执行逻辑代码
通过Message封装我们的消息,发送到handler所在线程队列中

案例

源码:

package com.julse.mutithreadproject;


import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;

public class MainActivity extends Activity {
    private Button button,btn_AsyncTask,btn_handler;
    private ProgressBar progressBar;
    private int progress;
//  import android.os.Handler;
    private Handler handler;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setTitle("多线程");

        button=(Button) findViewById(R.id.button1);
        btn_AsyncTask=(Button) findViewById(R.id.button2);
        btn_handler=(Button) findViewById(R.id.button3);
        progressBar=(ProgressBar) findViewById(R.id.progressBar1);
        handler=new Handler(){
            @Override
            public void handleMessage(Message msg) {
                // TODO Auto-generated method stub
                super.handleMessage(msg);
//              用于判断是否正常:msg.what==0x200
                if (msg.what==0x200) {
                    progressBar.setProgress(msg.arg1);
                    if (msg.arg1<100) {
                        btn_handler.setText("正在下载,当前进度为:"+msg.arg1+"%");
                    }else {
                        btn_handler.setText("下载完毕");
                    }

                }
            }

        };

        button.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                new Thread(){
                    public void run() {
                        progress=0;
                        while(progress<100){
                            try {
                                sleep(1000);
                                progress+=5;
//                              不能在子线程里面更改UI,要委托给主线程
//                              progressBar.setProgress(progress);
//                              button.setText("正在下载...当前下载进度是:"+progress+"%");
//                              方法一
                                runOnUiThread(new Runnable() {
                                    public void run() {
                                        progressBar.setProgress(progress);
                                        button.setText("正在下载...当前下载进度是:"+progress+"%");
                                    }
                                });
                            } catch (InterruptedException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                        }
//                      View ViewGroup 
//                      view.runnable()
//                      方法二
                        button.post(new Runnable() {

                            @Override
                            public void run() {
                                button.setText("下载完毕");

                            }
                        });
//                      方法三
                        button.postDelayed(new Runnable() {

                            @Override
                            public void run() {
                                button.setText("下载完毕!");

                            }
                        }, 5000);
                    };
                }.start();
            }
        });
        btn_AsyncTask.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                progress=0;
//              如果是一个下载线程,参数里面填网址
                new DownloadTask().execute();
            }
        });
        btn_handler.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                progress=0;
                Runnable r=new Runnable() {

                    @Override
                    public void run() {
                        // TODO Auto-generated method stub
                        while(progress<100){
                            try {
                                Thread.sleep(1000);
                                progress+=5;
//                              获得一个消息对象
                                Message msg=Message.obtain();
                                msg.what=0x200;
                                msg.arg1=progress;
//                              发到handler所在线程队列中
                                handler.sendMessage(msg);
                            } catch (InterruptedException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                        }
                    }
                };
                new Thread(r).start();
            }
        });
    }
//    AsyncTask:跨线程更新UI的第三种方式
    class DownloadTask extends AsyncTask<String, Integer, Object>{

        @Override
        protected Object doInBackground(String... arg0) {
            while(progress<100){
                try {
                    Thread.sleep(1000);
                    progress+=5;
                    publishProgress(progress);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }
            return null;
        }
//      完毕之后执行
        @Override
        protected void onPostExecute(Object result) {
            // TODO Auto-generated method stub
            super.onPostExecute(result);
            btn_AsyncTask.setText("执行完毕");
        }
//      预处理
//      @Override
//      protected void onPreExecute() {
//          // TODO Auto-generated method stub
//          super.onPreExecute();
//          btn_AsyncTask.setText("正在下载,当前进度"+progress+"%");
//      }

        @Override
        protected void onProgressUpdate(Integer... values) {
            // TODO Auto-generated method stub
            super.onProgressUpdate(values);
            progressBar.setProgress(progress);
            btn_AsyncTask.setText("正在下载,当前进度"+progress+"%");
        }


    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值