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

来源:互联网 发布:铂金数据 启信宝 编辑:程序博客网 时间:2024/06/05 08:16

案例运行效果:

跨线程更新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;    }}
原创粉丝点击