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,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();
时间: 2024-12-29 04:59:52

Android开发之ProgressDialog在独立Thread线程中更新进度的相关文章

【转】Android开发之旅:进程与线程

引言 当应用程序的组件第一次运行时,Android将启动一个只有一个执行线程的Linux进程.默认,应用程序所有的组件运行在这个进程和线程中.然而,你可以安排组件运行在其他进程中,且你可以为进程衍生出其它线程.本文从下面几点来介绍Android的进程与线程: 1.进程 2.线程 2.1.远程过程调用(Remote procedure calls,RPCs) 2.2.线程安全方法 1.进程 组件运行于哪个进程中由清单文件控制.组件元素——<activity>.<service>.&l

Android开发之ProgressDialog的使用

ProgressDialog类似于ProgressBar类. 用于显示一个过程,通常用于耗时操作. 几个方法介绍: 1.setMax() 设置对话框中进度条的最大值. 2.setTile() 设置标题. 3.setProgressStyl() 设置对话框中进度条的样式.例如:环形和水平. 参数: ProgressDialog.STYLE_SPINNER    环形精度条 ProgressDialog.STYLE_HORIZONTAL     水平样式的进度条 4.setMessage() 设置显

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

http://www.cnblogs.com/skynet/archive/2010/05/20/1740277.html 引言 上篇可以说是一个分水岭,它标志着我们从Android应用程序理论进入实践,我们拿起手术刀对默认的“Hello World!”程序进行了3个手术,我们清楚了“Hello world!”是如何实现显示在屏幕上的,而且我们知道不仅可以根据布局文件main.xml来初始化屏幕,还可编程地进行.以后基本我们都会以实践的方式来深入Android开发.我们这次深入分析Android

ios线程练习更新进度条

类似于,我们加载网页时候的进度条,我们来看看它们是怎么工作的. #import "ViewController.h" @interface ViewController () { UIProgressView *_view; } @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; //设置进度条 _view = [[UIProgressView alloc]init]; _view

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

在Android开发之bindService()通信的基础上,实现bindService()方法侦听service内部状态. 实现侦听service内部状态,使用的是回调机制 1.首先实现一个接口 1 public static interface CallBack{ 2 void onDataChange(String data); 3 } 2. 1 private CallBack callBack=null; 2 public void setCallBack(CallBack callB

Android开发之Handler和Looper的关系

关于Handler的总结. Message:消息,其中包含了消息ID,消息处理对象以及处理的数据等,由MessageQueue统一列队,终由Handler处理. Handler:处理者,负责Message的发送及处理.使用Handler时,需要实现handleMessage(Message msg)方法来对特定的Message进行处理,例如更新UI等. MessageQueue:消息队列,用来存放Handler发送过来的消息,并按照FIFO规则执行.当然,存放Message并非实际意义的保存,而

Android开发之UI更新交互机制与实例解析

android开发过程中,经常需要更新UI的状态和文案等.这是就需要对UI进行 更新.在android中更新UI一般有三种方法,handler机制.RunOnUiThread方法以及AsyncTask异步类方法等 本文下面就这三种方法进行了演示和代码实现. a.Handler机制通过使用消息机制来实现 b.RunOnUiThread方法是通过运行UI线程来达到更新UI的目的 c.AsyncTask是异步类,通过异步更新来更新UI 效果图如下:           (1)Java功能实现代码如下:

Android开发之Handler的使用方法(源代码分享)

Handler主要接受子线程发送的数据, 并用此数据配合主线程更新UI.. 当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的UI控件,进行事件分发.比如说, 你要是点击一个 Button ,Android会分发事件到Button上,来响应你的操作.  如果此时需要一个耗时的操作,例如: 联网读取数据或者读取本地较大的一个文件的时候,你不能把这些操作放在主线程中,,如果你放在主线程中的话,界面会出现假死现象, 如果5秒钟还没有完成的话,,会收到An

android开发之notification通知完全解析

android开发之notification通知完全解析 本文主要介绍的是notification通知的使用,通过阅读此文,你可以了解,在android开发中,notification通知各种使用方法.本文的notification主要是针对android4.4以下的版本. 现在,我们来看一下,如何实现一个notification.估计大家现在最常用的做法是下面这种: Notification notification = new Notification(R.drawable.ic_launc