Android开发之ProgressDialog在独立Thread线程中更新进度
简单的需求:在一个工作Thread中更新进度对话框ProgressDialog
遇到的问题:
1,创建需要Context,这个需要传进来
2,Thread中不能创建ProgressDialog,否则需要创建Looper
3,直接在Thread中更新ProgressDialog不行,扔例外,不是创建Thread的View不允许更新
4,Thread外创建Handler,然后现成里Post,更本不会更新。
解决方案:
1,创建ProgressDialog,同时创建Handler,用Callback handleMessage更新对话框
2,Thread中调用sendMessage之后,还需要调用Thread.yield()或Thread.sleep(),否则同样不更新。
示例代码:
final ProgressDialog pgDlg=new ProgressDialog(mContext);
pgDlg.setTitle("Testing ...");pgDlg.setMessage(" ");
pgDlg.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pgDlg.setIndeterminate(false); pgDlg.setMax(100);pgDlg.setProgress(0);
pgDlg.setIcon(android.R.drawable.ic_menu_search);
final Handler dlgHandler=new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
String s = (String)msg.obj;
pgDlg.setMessage(s);
if(msg.what>=100){
pgDlg.setProgress(100);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
pgDlg.dismiss();
}
},1000);
}else{
pgDlg.setProgress(msg.what);
}
return true;
}
});
pgDlg.show();
new Thread(new Runnable() {
@Override
public void run() {
BluetoothGattCharacteristic ctc=bleHelper.getCharacteristic(SampleGattAttributes.SERVICE_KeyService,SampleGattAttributes.CHARACTERISTIC_KeyCharacteristic);
for (int i=0;i<cmdsToTest.length;i++){
String cmd = cmdsToTest[i];
final String msg=String.format("command>:%s", cmd);
AppUtils.logD(msg);
ObdCommand oc = new ObdCommand(cmd, cmd);
final ObdCommandJob job = new ObdCommandJob(oc);
CommandExecutor executor = new BleCommandExecutor(bleHelper,ctc, job) .setLocker(mJobLock, mJobCondition);
try {
mJobLock.lock();
new Thread(executor).start();
mJobCondition.await(5, TimeUnit.SECONDS);
} catch (InterruptedException ex) {
Log.e("", ex.getMessage());
job.setState(ObdCommandJobState.EXECUTION_ERROR);
} finally {
mJobLock.unlock();
bleHelper.resumeIO();
}
if (job.getState() != ObdCommandJobState.FINISHED) {
errorMsg = String.format("test command %s failed!", job.getCommand().getCommand());
if (resultListener != null) {
resultListener.onTestDone(false, errorMsg);
Message.obtain(dlgHandler,,errorMsg).sendToTarget();
Thread.yield();
break;
}
}
final int progress = i*100/cmdsToTest.length;
Message.obtain(dlgHandler,progress,msg+"\nresult>:"+job.getCommand().getRawData()).sendToTarget();
//pgDlg.setMessage(msg); throw exception when access direct here
//pgDlg.incrementProgressBy(progress );
Thread.yield();//must yield to let message processed
}
if (resultListener != null) {
resultListener.onTestDone(true, "");
Message.obtain(dlgHandler,100,"done").sendToTarget();
Thread.yield();
}
bleHelper.close();
}
}).start();
Android开发之ProgressDialog在独立Thread线程中更新进度的更多相关文章
- Android开发之ProgressDialog与ProgressBar
ProgressDialog,继承AlertDialog.所以ProgressDialog就是一个在对话框中显示ProgressDialog,并显示进度的文本信息. 并且没有取消和确定按钮,只能通过b ...
- Android开发之旅: Intents和Intent Filters(理论部分)
引言 大部分移动设备平台上的应用程序都运行在他们自己的沙盒中.他们彼此之间互相隔离,并且严格限制应用程序与硬件和原始组件之间的交互. 我们知道交流是多么的重要,作为一个孤岛没有交流的东西,一定毫无意义 ...
- Android 开发之旅:深入分析布局文件&又是“Hello World!”
http://www.cnblogs.com/skynet/archive/2010/05/20/1740277.html 引言 上篇可以说是一个分水岭,它标志着我们从Android应用程序理论进入实 ...
- Android开发之bindService()侦听service内部状态
在Android开发之bindService()通信的基础上,实现bindService()方法侦听service内部状态. 实现侦听service内部状态,使用的是回调机制 1.首先实现一个接口 p ...
- Android开发之旅4:应用程序基础及组件
引言 为了后面的例子做准备,本篇及接下来几篇将介绍Android应用程序的原理及术语,这些也是作为一个Android的开发人员必须要了解,且深刻理解的东西.本篇的主题如下: 1.应用程序基础 2.应用 ...
- Android开发之Java集合类性能分析
对于Android开发者来说深入了解Java的集合类很有必要主要是从Collection和Map接口衍生出来的,目前主要提供了List.Set和 Map这三大类的集合,今天Android吧(ard8. ...
- Android开发之InstanceState详解
Android开发之InstanceState详解 本文介绍Android中关于Activity的两个神秘方法:onSaveInstanceState() 和 onRestoreInstanceS ...
- Android开发之Java必备基础
Android开发之Java必备基础 Java类型系统 Java语言基础数据类型有两种:对象和基本类型(Primitives).Java通过强制使用静态类型来确保类型安全,要求每个变量在使用之前必须先 ...
- Android开发之PopupWindow
/* * Android开发之PopupWindow * * Created on: 2011-8-8 * Author: blueeagle * Email: liujiaxiang@g ...
随机推荐
- ARCGIS FOR JAVASCRIPT API 出现multipleDefine问题
问题: Error {src: "dojoLoader", info: Object, stack: (...), message: "multipleDefine&qu ...
- Entity Framework 乐观并发控制
一.背景 我们知道,为了防止并发而出现脏读脏写的情况,可以使用Lock语句关键字,这属于悲观并发控制的一种技术,,但在分布式站点下,锁的作用几乎不存在,因为虽然锁住了A服务器的实例对象,但B服务器上的 ...
- [ucgui] 对话框2——小窗口初始化与消息响应
>_<" 上一节已经说过,创建过得窗口虽然可见,但是它们是以 “空”的形式出现的.这是因为对话框过程函数尚未包含初始化单个元素的代码.小工具的初始值.由它们所引起的行为以及它们之 ...
- Android 动态获取ListView的高度
public static void setListViewHeightBasedOnChildren(ListView listView) { ListAdapter listAdapter = l ...
- PHP动态压缩js,css
PHP动态压缩js,css 列表项 标签: PHP 正式发布产品时,我们希望将项目里的js,css合并压缩,以减少http请求.防止轻易查看源代码. 使用 只需要在头部引入一下代码即可: <me ...
- Atitit.人力资源管理原理与概论
Atitit.人力资源管理原理与概论 1. 人力资源管理 第一章 人力资源管理概述 第二章 人力资源理论基础与发展演变 第三章 人力资源规划 第四章工作分析与工作设计 第五章 员工招聘与录用 第六章 ...
- paip. uapi 过滤器的java php python 实现aop filter
paip. uapi 过滤器的java php python 实现aop filter filter 是面向切面编程AOP.. 作者Attilax 艾龙, EMAIL:1466519819@qq. ...
- WizardDialog 进度条使用记录
开发RCP的朋友们经常会使用到导航窗口, 先简单介绍一下wizardDialog,基本上他的使用方法是这样的 首先有一个WizardDialog,在dialog里面需要放一个Wizard来控制页面Wi ...
- ES6转码器babel的使用
1. 进入ES6的项目,执行 npm init // 初始化package.json 2. 在与package.json同一目录下编写配置文件 .babelrc { "presets&quo ...
- 结构体快排回顾(sort)
一般来说,我做竞赛的时候排序一般用快排 很快很方便 普通sort(从小到大) sort(a,a+n); 直接贴一段代码吧,包含了vector,sort,结构体等简单东西综合 #include < ...