使用runOnUiThread更新UI
来源:互联网 发布:linux和windows哪个快 编辑:程序博客网 时间:2024/05/17 05:57
android中更新UI的方式比较多,这里就不一一介绍了,比较常用的Thread+Handler,但是这种方式较繁琐,如在使用ProgressDialog创建进度对话框一文中就是使用的这种方式更新UI线程,下面介绍一种使用Activity的runOnUiThread方法来实现同样的功能,仍以此示例为例:
MainActivity:
package com.home.testrunonuithread;import android.app.Activity;import android.app.Dialog;import android.app.ProgressDialog;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class MainActivity extends Activity {// 该程序模拟填充长度为100的数组private int[] data = new int[100];private int hasData = 0;// 定义进度对话框的标识private final int PROGRESS_DIALOG = 0x112;// 记录进度对话框完成的百分比private int progressStatus = 0;// 定义一个进度对话框对象private ProgressDialog pd;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);Button btn = (Button) findViewById(R.id.btn1);btn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {progressStatus = 0;hasData = 0;// 显示指定对话框showDialog(PROGRESS_DIALOG);}});}// 创建对话框@Overrideprotected Dialog onCreateDialog(int id, Bundle args) {switch (id) {case PROGRESS_DIALOG:// 创建进度对话框pd = new ProgressDialog(this);pd.setMax(100);// 设置对话框标题pd.setTitle("任务完成百分比");// 设置对话框显示的内容pd.setMessage("下载完成的百分比");// 设置对话框不能用取"消按"钮关闭pd.setCancelable(false);// 设置对话框的进度条风格// pd.setProgressStyle(ProgressDialog.STYLE_SPINNER);pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);// 设置对话框的进度条是否显示进度pd.setIndeterminate(false);break;}return pd;}// 该方法将在onCreateDialog调用后被回调@Overrideprotected void onPrepareDialog(int id, Dialog dialog) {super.onPrepareDialog(id, dialog);switch (id) {case PROGRESS_DIALOG:// 对话框进度清零pd.incrementProgressBy(-pd.getProgress());new Thread() {public void run() {while (progressStatus < 100) {// 获取耗时任务完成的百分比progressStatus = doWork();// 运行于UI线程runOnUiThread(new Runnable() {@Overridepublic void run() {// 设置进度条的进度pd.setProgress(progressStatus);}});}// 如果任务已经完成if (progressStatus >= 100) {// 关闭对话框pd.dismiss();}}}.start();break;}}/** * 模拟一个耗时的操作 * * @return */public int doWork() {// 为数组元素赋值data[hasData++] = (int) (Math.random() * 100);try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}return hasData;}}
布局文件只有一个按钮不再给出。
从runOnUiThread的源码可以看出:
public final void runOnUiThread(Runnable action) { if (Thread.currentThread() != mUiThread) { mHandler.post(action); } else { action.run(); } }
程序首先会判断当前线程是否是UI线程,如果是就直接运行,如果不是则post,这时其实质还是使用的Handler机制来处理线程与UI通讯。
但这个方法,在处理一些简要的更新UI操作时(比如更新adapter等),显得更简洁、方便。
2 0
- 使用runOnUiThread更新UI
- 使用runOnUiThread更新UI
- activity 使用runOnUiThread更新 ui
- activity 使用runOnUiThread更新 ui
- 使用runOnUiThread更新主线程UI
- 使用Thread+Handler或runOnUiThread更新UI
- runOnUiThread 用于更新UI
- 更新UI-runOnUIThread
- runOnUiThread 更新ui
- 使用Activity类的runOnUiThread执行线程更新UI操作
- 使用Activity类的runOnUiThread执行线程更新UI操作
- runOnUIThread、Handler、AsyncTask与子线程结合使用更新UI
- Activity类的runOnUiThread更新UI
- 更新UI操作,Handler与runOnUiThread
- UI更新方法Handler和runOnUiThread
- Android 更新UI——runOnUiThread()
- runOnUiThread和Handler机制更新UI
- Android异步更新UI的方式之使用runOnUiThread(action)方法
- drbd与linux内核
- 第二篇 上传图片和Base64编码
- Spring:DispatcherServlet的详解
- java log4j配置说明
- DRAM,SRAM,SDRAM的关系与区别
- 使用runOnUiThread更新UI
- 架构之美-读书笔记之二
- web.py inet_pton windows部署错误
- 随笔-java进行内存分析
- 供应基于LayerFsd技术文件透明加密SDK
- ENVI5.1批量镶嵌工具界面按钮显示不全的解决方案
- IOS 给UIView绘制圆角、阴影
- 图片不存在显示默认图
- WARNING:Could not increase the asynch I/O limit to 64 for SQL direct I/O. It is set to 0