zoukankan      html  css  js  c++  java
  • 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();


  • 相关阅读:
    洛谷P1352没有上司的舞会+树形二维DP
    高精度模板(从洛谷题解中骗来的
    Codeforces#398 &767C. Garland 树形求子节点的和
    LuoGu-P1122 最大子树和+树形dp入门
    HDU-3549Flow Problem 最大流模板题
    Codeforces Round #486 (Div. 3)988E. Divisibility by 25技巧暴力||更暴力的分类
    Codeforces Round #486 (Div. 3)988D. Points and Powers of Two
    数据结构&字符串:01字典树
    数据结构:可持久化平衡树
    数据结构:并查集-拆点
  • 原文地址:https://www.cnblogs.com/riskyer/p/3241604.html
Copyright © 2011-2022 走看看