简单的需求:在一个工作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线程中更新进度的更多相关文章

  1. Android开发之ProgressDialog与ProgressBar

    ProgressDialog,继承AlertDialog.所以ProgressDialog就是一个在对话框中显示ProgressDialog,并显示进度的文本信息. 并且没有取消和确定按钮,只能通过b ...

  2. Android开发之旅: Intents和Intent Filters(理论部分)

    引言 大部分移动设备平台上的应用程序都运行在他们自己的沙盒中.他们彼此之间互相隔离,并且严格限制应用程序与硬件和原始组件之间的交互. 我们知道交流是多么的重要,作为一个孤岛没有交流的东西,一定毫无意义 ...

  3. Android 开发之旅:深入分析布局文件&又是“Hello World!”

    http://www.cnblogs.com/skynet/archive/2010/05/20/1740277.html 引言 上篇可以说是一个分水岭,它标志着我们从Android应用程序理论进入实 ...

  4. Android开发之bindService()侦听service内部状态

    在Android开发之bindService()通信的基础上,实现bindService()方法侦听service内部状态. 实现侦听service内部状态,使用的是回调机制 1.首先实现一个接口 p ...

  5. Android开发之旅4:应用程序基础及组件

    引言 为了后面的例子做准备,本篇及接下来几篇将介绍Android应用程序的原理及术语,这些也是作为一个Android的开发人员必须要了解,且深刻理解的东西.本篇的主题如下: 1.应用程序基础 2.应用 ...

  6. Android开发之Java集合类性能分析

    对于Android开发者来说深入了解Java的集合类很有必要主要是从Collection和Map接口衍生出来的,目前主要提供了List.Set和 Map这三大类的集合,今天Android吧(ard8. ...

  7. Android开发之InstanceState详解

    Android开发之InstanceState详解   本文介绍Android中关于Activity的两个神秘方法:onSaveInstanceState() 和 onRestoreInstanceS ...

  8. Android开发之Java必备基础

    Android开发之Java必备基础 Java类型系统 Java语言基础数据类型有两种:对象和基本类型(Primitives).Java通过强制使用静态类型来确保类型安全,要求每个变量在使用之前必须先 ...

  9. Android开发之PopupWindow

      /* *  Android开发之PopupWindow * *  Created on: 2011-8-8 *  Author: blueeagle *  Email: liujiaxiang@g ...

随机推荐

  1. Kali Linux系列教程之OpenVas安装

    Kali Linux系列教程之OpenVas安装 文 /玄魂 目录 Kali Linux系列教程之OpenVas安装 前言 1.  服务器层组件 2.客户层组件 安装过程 Initial setup ...

  2. [ACM_水题] ZOJ 3714 [Java Beans 环中连续m个数最大值]

    There are N little kids sitting in a circle, each of them are carrying some java beans in their hand ...

  3. 微软Dynamics 使用葡萄城的Wijmo 5提供移动端用户界面

    近日,全球最大的控件提供商葡萄城公司宣布: 葡萄城近日与微软公司达成合作,将Wijmo 产品线的HTML5和JaveScript 控件融合到微软Dynamics CRMOnline 2016版中. 随 ...

  4. error at ::0 can't find referenced pointcut解决办法(转载)

    原文:http://blog.sina.com.cn/s/blog_9ecb0d9d0101fheg.html Spring中采用annotation的方式实现AOP代理,运行测试代码时抛出以下异常: ...

  5. 转 CSS hack:针对IE6,IE7,firefox显示不同效果

    CSS hack:针对IE6,IE7,firefox显示不同效果 做网站时经常会用到,衡量一个DIV+CSS架构师的水平时,这个也很重要. 区别不同浏览器的CSS hack写法: 区别IE6与FF:  ...

  6. atitit.二进制数据无损转字符串网络传输

    atitit.二进制数据无损转字符串网络传输 1. gbk的网络传输问题,为什么gbk不能使用来传输二进制数据 1 2. base64 2 3. iso-8859-1  (推荐) 2 4. utf-8 ...

  7. web前端基础——jQuery编程进阶

    1 jQuery本质 jQuery不是一门独立的语言,它是JavaScript的一个类库或框架.jQuery的核心思想就是:选取元素,对其操作.很多时候写jQuery代码的关键就是怎样设计合适的选择器 ...

  8. hud2544dijkstra+堆优化

    该算法对于稠密图更加有效: 对于给出具有非负权重的边和源顶点S的图G,算法可在O(mlogn)时间内找出从s点到其他每一个顶点的距离. 如果图是稠密的,即对于某个ε>0,m>=n^(1+ε ...

  9. C#中使用DES和AES加密解密

    C#中使用DES和AES加密解密 2008-01-12 09:37 using System;using System.Text;using System.Security.Cryptography; ...

  10. 关于python测试webservice接口的视频分享

    现在大公司非常流行用python做产品的测试框架,还有对于一些快速原型产品的开发也好,很好地支持OO编程,代码易读.Python的更新挺快的,尤其是第三方库. 对于测试人员,代码基础薄弱,用pytho ...