博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android开发之ProgressDialog在独立Thread线程中更新进度
阅读量:6985 次
发布时间:2019-06-27

本文共 3121 字,大约阅读时间需要 10 分钟。

简单的需求:在一个工作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
:%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,100,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();

 

转载于:https://www.cnblogs.com/dajianshi/p/5085022.html

你可能感兴趣的文章
wxPython 4.0.0b2安装
查看>>
Android RecyclerView利用Glide加载大量图片into(Target)导致OOM异常
查看>>
UGUI表情系统解决方案
查看>>
ubuntu 下执行定时任务
查看>>
将td中文字过长的部分变成省略号显示的小技巧
查看>>
Cesium随笔(1)部署自己的项目 【转】
查看>>
.NET 程序集单元测试工具 SmokeTest 应用指南
查看>>
HTTP Health Checks
查看>>
为什么正态分布如此普遍
查看>>
centos安装jdk
查看>>
jQuery事件
查看>>
BBS论坛(三十)
查看>>
通过PMP考试
查看>>
轻松看懂Java字节码
查看>>
2011年总结以及2012的展望
查看>>
AE TIN的切割
查看>>
ASP.NET图片上传,删除
查看>>
贝叶斯推断及其互联网应用(一)
查看>>
Visual Studio 2010 创建的WCF服务 第一个应用
查看>>
redis 下载启动,设置、查询超时时间
查看>>