Android BadTokenException 问题解决
来源:互联网 发布:charles汉化破解版mac 编辑:程序博客网 时间:2024/06/15 23:11
前言
今天测试过程中发现了“android.view.WindowManager$BadTokenException”问题,这里记录一下解决方法。(PS:第一款应用上线了,感觉BUG还是比较多,感觉因为这个应用,能不能过试用期都是问题了,只能坚持加油了)。
问题分析
这种问题其实在错误日志中都能给出很好的提示,下面贴一下部分有用的错误日志,如下所示:
android.view.WindowManager$BadTokenException,ViewRootImpl.java,android.view.ViewRootImpl,setView,640,android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@444628b8 is not valid, is your activity running?通过日志,可以知道,这种问题一般是因为在AsyncTask中的onPostExecute中执行了启动Dialog操作,但是当前的Activity已经被销毁了,写一个错误代码复现一下该问题:
package com.example.testlibrary;import android.app.Activity;import android.app.AlertDialog;import android.content.DialogInterface;import android.content.DialogInterface.OnClickListener;import android.os.AsyncTask;import android.os.Bundle;public class MainActivity extends Activity {private UpdateUIAsyncTask asyncTask;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);updateUIProcess();}private void updateUIProcess() {asyncTask = new UpdateUIAsyncTask();asyncTask.execute();}private class UpdateUIAsyncTask extends AsyncTask<Void, Void, Boolean> {@Overrideprotected void onPostExecute(Boolean result) {if (!isCancelled() && result) {AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this).setTitle("标题").setMessage("这是内容").setPositiveButton("确定", new OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {dialog.dismiss();}}).setNegativeButton("取消", new OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {dialog.dismiss();}});AlertDialog dialog = builder.create();dialog.show();}}@Overrideprotected Boolean doInBackground(Void... params) {if (!isCancelled()) {try {Thread.sleep(6000);} catch (InterruptedException e) {return false;}return true;}return true;}}}启动应用程序,并且在6s以内退出应用程序,返回建即可,就会发现应用程序出现了异常:
解决方案
如果当前Activity已经被销毁(无论是调用finish()或者按back、home键),但是Activity中的AsyncTask异步任务并没有结束,并且在onPostExecute中调用了alertDialog.show()就会出现:
android.view.WindowManager$BadTokenException: Unable to add window — token android.os.BinderProxy@4272a800 is not valid; is your activity running?.解决方法也很简单:在alertDialog.show()执行之前,判断当前的Activity是否已经销毁了,可以使用android提供的isFinishing()方法。同时,在Activity中也应该增加清理AsyncTask的操作,示例代码如下:
package com.example.testlibrary;import android.app.Activity;import android.app.AlertDialog;import android.content.DialogInterface;import android.content.DialogInterface.OnClickListener;import android.os.AsyncTask;import android.os.Bundle;public class MainActivity extends Activity {private UpdateUIAsyncTask asyncTask;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);updateUIProcess();}@Overrideprotected void onDestroy() {// 增加清理AysncTask操作if (asyncTask != null && asyncTask.getStatus() != AsyncTask.Status.FINISHED) {asyncTask.cancel(true);}super.onDestroy();}private void updateUIProcess() {asyncTask = new UpdateUIAsyncTask();asyncTask.execute();}private class UpdateUIAsyncTask extends AsyncTask<Void, Void, Boolean> {@Overrideprotected void onPostExecute(Boolean result) {// show dialog之前增加判断当前Activity是否finish操作if (!isCancelled() && result && MainActivity.this != null && !MainActivity.this.isFinishing()) {AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this).setTitle("标题").setMessage("这是内容").setPositiveButton("确定", new OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {dialog.dismiss();}}).setNegativeButton("取消", new OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {dialog.dismiss();}});AlertDialog dialog = builder.create();dialog.show();}}@Overrideprotected Boolean doInBackground(Void... params) {if (!isCancelled()) {try {Thread.sleep(6000);} catch (InterruptedException e) {return false;}return true;}return true;}}}
0 0
- Android BadTokenException 问题解决
- PopupWindow报错android.view.WindowManager$BadTokenException的问题解决
- android 实现全局对话框中context的问题 .WindowManager$BadTokenException问题解决
- 常见的android.view.WindowManager$BadTokenException: Unable to add window问题解决
- Android WindowManager$BadTokenException异常
- android.view.WindowManager$BadTokenException
- Android WindowManager$BadTokenException异常
- android.view.WindowManager$BadTokenException
- Android WindowManager$BadTokenException异常
- android之BadTokenException异常
- Android WindowManager$BadTokenException 处理
- Android WindowManager$BadTokenException错误
- Android的BadTokenException
- android.view.WindowManager$BadTokenException
- android.view.WindowManager$BadTokenException
- Android :BUG:WindowManager$BadTokenException
- BadTokenException
- BadTokenException
- codeforces B. Pasha Maximizes
- ThreadingMixIn与HTTPServer
- POJ 2442 Sequence
- STL学习之LIST
- 完全背包
- Android BadTokenException 问题解决
- java位运算符(练习)
- 初学者之Android HelloWorld项目
- 上海传智播客JAVASE_day04学习笔记
- Web Api 图片上传
- 一些我想干的活
- OC视频笔记-3
- Oracle sqlplus 相关快捷键设置
- 问题就是机会之补位