简单的需求:在一个工作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. quartznet笔记

    http://sourceforge.net/projects/quartznet/files/quartznet/

  2. 实验五 含有控制信号的计数器VHDL设计

    一.实验目的 学习计数器的设计.仿真和硬件测试,进一步熟悉VHDL设计技术. 二.实验仪器与器材 计算机1台,GW48-PK2S实验箱1台,QuartusⅡ6.0 1套. 三.实验 1. 基本命题 在 ...

  3. Dos脚本判断文件大小

    @echo off & setlocal EnableDelayedExpansion del 1.txt /q del 2.txt /q for /f %%i in (*) do (echo ...

  4. Oracle数据库建表+添加数据练习

    SQL脚本: --建表 --student表+注释 create table student( sno ) not null, sname ) not null, ssex ) not null, s ...

  5. Xcode7

    Xcode 7有什么新的特性.Xcode中7包含你需要创建的iPhone,iPad,Mac和Apple关注惊人的应用程序的一切.Swift编程语言已更新,现在比以往任何时候都更快,具有强大的功能,使你 ...

  6. javaweb学习总结(九)—— 通过Servlet生成验证码图片

    一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类,如下:

  7. 通过swap代码分析C语言指针在汇编级别的实现

    我们先用C语言写一个交换两个数的代码: void swap(int *a, int *b){ int temp = *a; *a = *b; *b = temp; } int main(void) { ...

  8. Ubuntu “无法获得锁”解决方案(E: 无法获得锁 /var/cache/apt/archive

    Ubuntu “无法获得锁”解决方案(E: 无法获得锁 /var/cache/apt/archive   现象一: E: 无法获得锁 /var/lib/dpkg/lock - open (11: 资源 ...

  9. LPC43xx SGPIO DMA and Interrupts

    The SGPIO output pins SGPIO14 and SGPIO15 can trigger a GPDMA request SGPIO pins SGPIO14 and SGPIO15 ...

  10. 报错:LINQ to Entities 不识别方法

    大致是: var products = db.Products.Select(new ProductVm{Name=SomeMethod() }); 针对IQueryable集合的查询操作会被LINQ ...