AsyncTaskとダイアログにviewが表示されます.WindowManager$BadTokenException: Unable to add window…is not valid; is your a


最近1つの奇抜な問題に出会って、気がふさぐ前によく見ていません.問題はたまに発生する.ログを再表示すると、
view.WindowManager$BadTokenException: Unable to add window…is not valid; is your activity running?
どうしたの?そうですね.activityにはdestoryがありません.走っているのに、どうしてダイアログボックスがactivityに添付されて追加できないのですか.無効だと言っていますが、activityがdestoryされたようですね.
後でコードを一つ一つチェックして、確かにactivityがdestoryによって存在している場合、異常はまだキャプチャされていませんが、非同期のAsynTaskはまだ実行されています.その後異常がキャプチャされ、ダイアログでエラーが表示されると、エラーが報告され、activityは死んでしまい、ダイアログはまだ生きているのか、ヒントはもう意味がありません.後続の処理を放棄すべきだ.
では、実は異常タスクにisFinishing()を加えて判断するだけで、activityが切れたら、放っておきます....
     new AsyncTask<Void, Void, Object>(){
			boolean isNoNetException  = false;
			boolean isNetLagException  = false; //           
			boolean isConnException = false;  //    ,      
			@Override
			protected void onPreExecute() {
				//TODO              
				pd = new ProgressDialog(SCInfoGainActivity.this);
				pd.setProgressStyle(ProgressDialog.STYLE_SPINNER);
				pd.setMessage(getString(R.string.pop_window_waiting_submit_tip));
				pd.show();
			}
			
			@Override
			protected Object doInBackground(Void... params) {
				DataService ds = new DataService(SCInfoGainActivity.this);
				Object retVal = null;
				try {
					retVal = ds.persubmitServiceChangeInfo(checkPhoneCustInfo.getUserId(), servicenum, checkPhoneCustInfo.getNettype(), serviceLists);
				}catch (HessianConnectionException e) {
					if(!DeviceUtil.isConnect(SCInfoGainActivity.this)){
						//         
						isNoNetException = true;
					}else{
						//     ,   
						isNetLagException = true;
					}
				}catch (SocketTimeoutException e) {
					L.v(SCInfoGainActivity.class.getSimpleName(), "SocketTimeoutException ... "+e.getLocalizedMessage());
					if(!DeviceUtil.isConnect(SCInfoGainActivity.this)){
						isNoNetException = true;  //         
					}else{
						isNetLagException = true;  //        ,   
					}
					e.printStackTrace();
				}catch (ConnectException e){
					L.v(SCInfoGainActivity.class.getSimpleName(), "SocketTimeoutException ... "+e.getLocalizedMessage());
					if(!DeviceUtil.isConnect(SCInfoGainActivity.this)){
						isNoNetException = true;  //         
					}else{
						isConnException = true;  //        ,   
					}
				}catch (Exception e) {
					//        ,                  ....
					e.printStackTrace();
				}
				return retVal;
			}

			@Override
			protected void onPostExecute(Object result) {
				if(isFinishing()) return ;  // activity     ,         
				pd.dismiss();
				if(isNoNetException){
					tipDialog.setContent(getString(R.string.tip_window_checknet));
					tipDialog.show();
				}else if(isNetLagException){
					tipDialog.setContent(getString(R.string.tip_window_nostable_net));
					tipDialog.show();
				}else if(isConnException){
					tipDialog.setContent(getString(R.string.tip_window_loseconn));
					tipDialog.show();
				}else{
					handlePersubmitOrder(result);
				}
			}
			
		}.execute();