随时随地技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666)

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等),显得更简洁、方便。

使用runOnUiThread更新UI相关推荐

  1. 为什么子线程中不能直接更新UI

    点击上方"dotNET全栈开发","设为星标" 加"星标★",每天11.50,好文必达 全文约4000字,预计阅读时间8分钟 当初有同事就碰 ...

  2. Android 更新UI的两种方法——handler和runOnUiThread()

    Android 更新UI的两种方法--handler和runOnUiThread() 在Android开发过程中,常需要更新界面的UI.而更新UI是要主线程来更新的,即UI线程更新.如果在主线线程之外 ...

  3. 安卓在子线程中实现更新UI界面的三种方法 Handler+Message、runOnUiThread、控件.post()

    1.说明 安卓中UI线程为主线程,更新UI界面必须在主线程中进行,在子线程中实现更新UI界面的三种方法:Handler.RunOnUiThread.控件.post() 2.1 Handler (1)定 ...

  4. android ui 最新教程,Android更新UI的五种方式,androidui五种

    Android更新UI的五种方式,androidui五种handler.post activity.runOnUiThread view.post handler+Thread AsyncTask 例 ...

  5. Android更新Ui的几种方法

    2019独角兽企业重金招聘Python工程师标准>>> 常用的几种方法简单概括有: - handler.sendMessage(); - handler.post(); - 在act ...

  6. Android子线程中更新UI的4种方法

    方法一:用Handler 1.主线程中定义Handler: Handler mHandler = new Handler() { @Override public void handleMessage ...

  7. android 异步刷新 方法,android应用中实现异步更新UI的方法有哪些

    android应用中实现异步更新UI的方法有哪些 发布时间:2020-12-07 17:12:00 来源:亿速云 阅读:144 作者:Leah android应用中实现异步更新UI的方法有哪些?相信很 ...

  8. 【转】Android子线程真的不能更新UI么

    Android单线程模型是这样描述的: Android UI操作并不是线程安全的,并且这些操作必须在UI线程执行 如果在其它线程访问UI线程,Android提供了以下的方式: Activity.run ...

  9. Android 更新UI的几种方式

    1.Activity的 runOnUiThread textView = (TextView) findViewById( R.id.tv ); new Thread(new Runnable() { ...

最新文章

  1. 论强化学习的根本缺陷
  2. jsp内置对象与el内置对象
  3. 吃香椿的注意事项:焯水
  4. cloud foundry_使用“另类” Cloud Foundry Gradle插件无需停机
  5. uinty粒子系统子物体变大_Unity的粒子系统(一)基础篇
  6. Sublime Text + CTags + Cscope (部分替代Source Insight)
  7. Jira7.10.1在Windows环境下的安装和配置
  8. css模块化配置---webpack4+less
  9. 华为手机连不上adb解决方法
  10. 天线的特性及微带天线的设计
  11. QQ截图出现闪退,无法截图(亲测有效)
  12. SQL 汉字笔画排序 音序排序
  13. 阿里巴巴集团去IOE运动的思考与总结
  14. vue 使用fs_在vue里面使用iVew框架
  15. Java多线程:synchronized | Volatile 和Lock和ReadWriteLock多方位剖析(一)
  16. React Native ---fetch 之GET请求带参数
  17. 企业业务架构设计方法论及实践(二)
  18. Elasticsearch 组合聚集(Composite aggregation)实现交叉分析
  19. 世界杯网页梦幻联动.html
  20. 腾讯又一开源力作发布

热门文章

  1. ROS到ROS2的多节点组合运行
  2. 0到3个月的宝宝护理重点和注意事项,家长要记住哦
  3. 龙珠游戏-博弈之斐波那契数列
  4. 回车enter键的js
  5. 关闭amazon kindle 个人文档服务“请在48小时内点击下方以验证此请求”
  6. async await 处理异步变同步(微信小程序内举例)
  7. 春季早晚温差大,提醒您注意及时加减衣服——附“感冒食疗方”若干,供收藏。
  8. PHP - 什么是 PHP? 为什么用 PHP? 有谁在用 PHP?
  9. 用python画小仓鼠教程_小仓鼠简笔画教程
  10. AI芯片:寒武纪NPU设计分析(DianNao)