android跨线程更新UI的三种方法
来源:互联网 发布:铂金数据 启信宝 编辑:程序博客网 时间:2024/06/05 08:16
案例运行效果:
直接启动一个线程: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类
一条 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; }}
阅读全文
0 0
- android跨线程更新UI的三种方法
- android线程中更新UI的三种方法 Demo
- Android关于线程更新UI的方法
- Android关于线程更新UI的方法
- Android关于线程更新UI的方法
- Android更新Ui线程的四个方法
- Android子线程更新UI的方法
- Android子线程中更新UI的三种方法和获取message的两种方法总结
- Android子线程中更新UI的三种方法和获取message的两种方法总结
- Android在子线程更新UI的4种方法
- Android子线程中更新UI的3种方法
- Android子线程中更新UI的3种方法
- Android子线程中更新UI的3种方法
- Android子线程中更新UI的3种方法
- Android子线程中更新UI的3种方法
- Android子线程中更新UI的3种方法
- android中子线程更新UI的几种方法
- Android子线程中更新UI的3种方法
- Android音频系统之AudioPolicyService
- weblogic部署问题,Caused by: weblogic.descriptor.BeanAlreadyExistsException: Bean already exists: "weblog
- 清除浮动
- async await 就ajax因果调用解决方案(思路:以同步的思维解决异步的调用)
- Listview选中效果
- android跨线程更新UI的三种方法
- webstorm es6--es5
- python 闭包和修饰器
- JAVA 基础语法(二)——基本数据类型转换以及运算符
- HA集群搭建
- 手机锁机病毒解锁清除教程
- -Warc-performSelector-leaks
- 机器学习笔记之什么是机器学习
- iOS 自定义多张图片选择+demo