最近遇到一个奇葩的问题,好郁闷 之前也没有仔细看。问题偶尔出现一次。再去查看日志时,出现
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();