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 ...
随机推荐
- [转]一个文件上传的jquery插件
http://www.jb51.net/article/51547.htm 这篇文章主要介绍了使用ajaxfileupload.js实现ajax上传文件php版,需要的朋友可以参考下 无论是P ...
- 辐射4 中文武器命名方法, 不用winhex, 直接游戏内操作
参考资料:https://www.reddit.com/r/fo4/comments/3t354b/tip_you_can_add_text_formatting_italic_underline/h ...
- ASP.NET MVC简单编程之(二)经典路由篇
话题:请求从路由开始 在实际的ASP.NET MVC开发中,URL访问规则----路由的定义是非常重要的.因为任何一个请求都离不开路由.理解它,我们将能理解MVC处理请求的整个过程,灵活地定义系统各种 ...
- Linux下的NFS配置(转)
http://rubyer.me/blog/1682/ 遇到的问题: 1.reason given by server: Permission denied 在服务器的/etc/export配置文件中 ...
- ecshop2.72文件结构说明
ECShop 2.7.2 的结构图及各文件相应功能介绍 ECShop 2.7.2 upload 的目录┣ activity.php 活动列表┣ affiche.php 广告处理文件┣ affiliat ...
- How Tomcat works — 四、tomcat启动(3)
上一节说到StandardService负责启动其子组件:container和connector,不过注意,是有先后顺序的,先启动container,再启动connector,这一节先来看看conta ...
- 在ArcGIS空间数据库中增加点数据的方法
1.新建一个mxd(ArcMAP)文件 2.从ArcCatalog中把要编辑的图层拖到ArcMAP中 3.从ArcCatalog中拖一个参照图层到ArcMAP中,比如临沂市的县级区划图 4.打开Edi ...
- android: 创建自己的内容提供器
我们学习了如何在自己的程序中访问其他应用程序的数据.总体来说思 路还是非常简单的,只需要获取到该应用程序的内容 URI,然后借助 ContentResolver 进行CRUD 操作就可以了.可是你有没 ...
- C# 设置和获取一个字节的某一位的值的方法
自己工作中遇到需要对单字节的高位.低位进行赋值,即一个字节byte,想要给每一位都赋值,这个值是动态来的,是0或是1. 好不容易收集到一些珍贵资料,整理一下: 一.设置 方法code: /// < ...
- 【转】webstorm 注册码 / phpstorm 注册码
WebStorm注册码 User Name: EMBRACE License Key: ===== LICENSE BEGIN ===== 24718-12042010 00001h6wzKLpfo3 ...