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