android跨线程更新UI的三种方法
2017-06-05 15:38
477 查看
案例运行效果:
使用runOnUiThread类
或者使用按钮控件自身方法:
或者延时地更新按钮内容
doInBackground(String… arg0)
onPostExecute(Object result)
onProgressUpdate()
然后在主线程里面使用
new DownloadTask().execute();
4000
一条 Message经过这样一个流程的辗转调用后,也就从子线程进入到了主线程,从不能 更新 UI变成了可以更新 UI
在handler类中重写handleMessage(Message msg)方法
判断msg.what的值决定是否执行逻辑代码
通过Message封装我们的消息,发送到handler所在线程队列中
直接启动一个线程: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;
}
}
相关文章推荐
- Android子线程中更新UI的三种方法和获取message的两种方法总结
- Android非UI线程更新UI的几种方法
- Android在子线程中更新Activity中UI的方法
- Android关于线程更新UI的方法
- Android子线程中更新UI的三种方法和获取message的两种方法总结
- 知识梳理:Android子线程中更新UI的3种方法
- Android非UI线程更新UI的几种方法
- Android关于线程更新UI的方法
- 老问题:Android子线程中更新UI的3种方法
- 子线程更新UI会发生android.view.ViewRoot$CalledFromWrongThreadException异常的解决方法 .
- 子线程更新UI会发生android.view.ViewRoot$CalledFromWrongThreadException异常的解决方法
- Android关于线程更新UI的方法
- Android在非UI线程中更新UI的方法
- Android子线程中更新UI的3种方法
- 子线程更新UI会发生android.view.ViewRoot$CalledFromWrongThreadException异常的解决方法 .
- (转)Android在子线程中更新Activity中UI的方法
- Android在子线程中更新Activity中UI的方法
- Android在子线程中更新Activity中UI的方法
- Android中子线程中更新UI的N中方法
- android子线程中更新UI的方法