Android開發之ProgressDialog在獨立Thread線程中更新進度

來源:互聯網
上載者:User

標籤:

簡單的需求:在一個工作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();

 

Android開發之ProgressDialog在獨立Thread線程中更新進度

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.