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; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btn = (Button) findViewById(R.id.btn1);
btn.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
progressStatus = 0;
hasData = 0;
// 显示指定对话框
showDialog(PROGRESS_DIALOG);
}
});
} // 创建对话框
@Override
protected 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调用后被回调
@Override
protected 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() { @Override
public 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. android子线程更新UI

    参考:https://www.cnblogs.com/joy99/p/6121280.html 子线程是不能直接更新UI的.Android实现View更新有两组方法,分别是invalidate和pos ...

  2. Android学习笔记之:android更新ui的几种经常用法

    Android主线程不能运行耗时操作.我们通常是在子线程中运行耗时操作, 我们在运行完耗时操作后,我们一般能够通过下面几种方式来实现ui界面的更新. 首先是布局文件: <LinearLayout ...

  3. 我的Android最佳实践之—— Android更新UI的两种方法:handler与runOnUiThread()

    在Android开发过程中,常需要更新界面的UI.而更新UI是要主线程来更新的,即UI线程更新.如果在主线线程之外的线程中直接更新页面 显示常会报错.抛出异常:android.view.ViewRoo ...

  4. Android更新UI的两种方法——handler与runOnUiThread()

    在Android开发过程中,常需要更新界面的UI.而更新UI是要主线程来更新的,即UI线程更新.如果在主线线程之外的线程中直接更新页面 显示常会报错.抛出异常:android.view.ViewRoo ...

  5. 关于runOnUiThread()与Handler两种更新UI的方法

    在Android开发过程中,常需要更新界面的UI.而更新UI是要主线程来更新的,即UI线程更新.如果在主线线程之外的线程中直接更新页面显示常会报错.抛出异常:android.view.ViewRoot ...

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

    今天看到了一个runOnUiThread()方法用来更新UI,觉得很神奇!! 方法一:handler机制不说了. 方法二:利用Activity.runOnUiThread(Runnable)把更新ui ...

  7. 记录一下关于在工具类中更新UI使用RunOnUiThread犯的极其愚蠢的错误

    由于Android中不能在子线程中更新ui,所以平时在子线程中需要更新ui时可以使用Android提供的RunOnUiThread接口,但是最近在写联网工具类的时候,有时候会出现联网异常,这个时候为了 ...

  8. Android 更新UI的几种方式

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

  9. Android线程间通信更新UI的方法(重点分析EventBus)

    Android的UI更新只能在UI线程中,即主线程.子线程中如果要进行UI更新,都是要通知主线程来进行. 几种实现方式总结如下,欢迎补充. 1.runOnUiThread() 子线程中持有当前Acti ...

随机推荐

  1. cassandra + lucene集成

    Stratio’s Cassandra Lucene Index Stratio’s Cassandra Lucene Index, derived from Stratio Cassandra, i ...

  2. css3文本效果

    CSS3 包含多个新的文本特性. 在本章中,您将学到如下文本属性: 1. text-shadow 2. word-wrap 浏览器支持 Internet Explorer 10.Firefox.Chr ...

  3. iOS集成微信支付

    微信支付的开发 前言:之前听说过微信支付有很多坑,其实没有想象的那么坑,整体感觉很容易上手,按照它的流程来不会有错!PS:官方的流程看的TMD烦,好啦,废话有点多,进入开发.(ps:每个微信的版本一直 ...

  4. spark on yarn :state: ACCEPTED一直 出现

    今天运行spark on yarn 一直出现 16/09/20 18:40:41 INFO yarn.Client: Application report for application_147417 ...

  5. css selection改变文字反选的背景颜色

    <style type="text/css"><!--.ai::-moz-selection { background:#cc0000; color:#fff; ...

  6. web2py官方文档翻译

    00前言 我相信能够轻松地构建高质量增长的web应用程序是至关重要的一个自由和开放的社会.这可以防止玩家最大的垄断信息的流通. 因此我从2007年开始web2py项目,主要是作为一种教学工具与简化we ...

  7. c代码中调用c++,c++代码中调用c代码

    注意这里的c调用c++或者c++调用c的意思是.c文件中调用.cpp文件中的代码,或者相反 集成开发环境如vc++6.0或者vs都是通过文件后缀来区别当前要编译的是C代码还是C++代码,然后采用相应的 ...

  8. C语言 —— 括号配对问题(不使用栈)

    最近在南阳理工的OJ上刷题,看到一个有点意思的题目 网上的答案大多都使用了栈,可惜我还没有学习数据结构,所以只能用简单的方法来解决 题目的链接在这 http://acm.nyist.net/Judge ...

  9. 国标电表DLT645转MODBUS TCP协议转换器MRD-5021,工业设备,浪涌三级保护MRD

    DL/T645转ModbusTcp协议转换器 MRD-5021具有1 路RS485及1路以太网接口,最多支持同时采集5个DL/T645-1997或者5个2007协议国标电表设备,支持DL/T645协议 ...

  10. QueryString和BASE64

    加号(+)是BASE64编码的一部分,而加号在QueryString中被当成是空格.因此,当一个含有BASE64编码的字符串直接作为URL的一部分时,如果其中含有加号,则使用QueryString读取 ...