您的位置:首页 > 产品设计 > UI/UE

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

2017-06-05 15:38 429 查看
案例运行效果:





直接启动一个线程: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();

4000

使用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;
}

}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: