AsyncTask 与 对话框显示 view.WindowManager$BadTokenException: Unable to add window…is not valid; is your a

最近遇到一个奇葩的问题,好郁闷 之前也没有仔细看。问题偶尔出现一次。再去查看日志时,出现

view.WindowManager$BadTokenException: Unable to add window…is not valid; is your activity running?


什么情况,activity is runing? 对呀,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();


原文地址:https://www.cnblogs.com/riskyer/p/3241604.html