android ProgressDialo异常 no dialog with id 0 was ever shown via Activity#showDialog

http://byandby.iteye.com/blog/1133327

    屏幕中央有一个ProgressDialog 提示正在验证账户,验证的过程是通过一个异步任务来完成的,但是如果这时我不停的点击Back键--》一定要不停的点,就会抛出一个异常,异常见下图。 


android ProgressDialo异常 no dialog with id 0 was ever shown via Activity#showDialog_第1张图片

   这个异常的意思就是说没有一个 id为0的dialog 已经通过 showDialog()方法显示了。出现这个异常的原因是:当我们点击Back键的时候ProgressDialog 其实已经被结束了,它在当前的那个 Activity已经不存在了,然而后台的AsyncTask任务其实还在继续执行 。。然后我们又在onPostExecute() 方法取消显示这个Dialog,但是 这个时候 这个dialog已经没了啊,因为当我们点击Back键的时候 就会结束那个Dialog!! 找不到它了 所以抛出了这个异常。  

   解决办法就是 设置那个Dialog的onCancel事件,并且在onCancel方法里边判断 如果那个AsyncTask任务对象不等于null ,就结束它,代码片段如下。 
Java代码   收藏代码
  1. private AccountVerifyAsyncTask mAccountVerifyTask;  


Java代码   收藏代码
  1. if(mAccountVerifyTask == null || mAccountVerifyTask.getStatus() == AsyncTask.Status.FINISHED || mAccountVerifyTask.isCancelled()){  
  2.             mAccountVerifyTask = (AccountVerifyAsyncTask) new AccountVerifyAsyncTask().execute(username,password);  
  3.         }  


Java代码   收藏代码
  1. class AccountVerifyAsyncTask extends AsyncTask{  
  2.           
  3.         @Override  
  4.         protected void onPreExecute() {  
  5.             showDialog(VERIFY_DIALOG_KEY);  
  6.         }  
  7.   
  8.   
  9.         @Override  
  10.         protected Integer doInBackground(String... params) {  
  11.             String username = params[0];  
  12.             String password = params[1];  
  13.             int result = AccountManager.instance().accountVerify(username, password);  
  14.             return result;  
  15.         }  
  16.           
  17.         @Override  
  18.         protected void onPostExecute(Integer result) {  
  19.             dismissDialog(VERIFY_DIALOG_KEY);  
  20.             int code = result;  
  21.             AccountManager.instance().handleVerifyResult(code);  
  22.             if(AccountManager.SUCCESS == code){  
  23.                 AccountManager.QUERY_CANCELED = false;  
  24.                 onAccountChanged();  
  25.             }  
  26.         }  
  27.     }  

   
Java代码   收藏代码
  1. switch(id){  
  2.         case VERIFY_DIALOG_KEY: {  
  3.             final ProgressDialog dialog = new ProgressDialog(this);  
  4.             dialog.setMessage(getResources().getString(R.string.account_verify_account));  
  5.             dialog.setIndeterminate(true);  
  6.             dialog.setCancelable(true);  
  7.             dialog.setOnCancelListener(new DialogInterface.OnCancelListener() {  
  8.                   
  9.                 @Override  
  10.                 public void onCancel(DialogInterface dialog) {  
  11.                     if(mAccountVerifyTask != null){  
  12.                         mAccountVerifyTask.cancel(true);  
  13.                     }  
  14.                 }  
  15.             });  
  16.             //mVerifyDialog = dialog;  
  17.             return dialog;  
  18.         }  

你可能感兴趣的:(Android,转载)