I was seeing this error reported once in a while from some of my apps, and here's what solved it for me:
if(!((Activity) context).isFinishing())
{
//show dialog
}
All the other answers out there seem to be doing weird things like iterating through the list of running activities, but this is much simpler and seems to do the trick.
This can occur when you are showing the dialog for a context that no longer exists. A common case - if the 'show dialog' operation is after an asynchronous operation, and during that operation the original activity (that is to be the parent of your dialog) is destroyed. For a good description, see this blog post and comments:
http://dimitar.me/android-displaying-dialogs-from-background-threads/
From the stack trace above, it appears that the facebook library spins off the auth operation asynchronously, and you have a Handler - Callback mechanism (onComplete called on a listener) that could easily create this scenario.
When I've seen this reported in my app, its pretty rare and matches the experience in the blog post. Something went wrong for the activity/it was destroyed during the work of the the AsyncTask. I don't know how your modification could result in this every time, but perhaps you are referencing an Activity as the context for the dialog that is always destroyed by the time your code executes?
Also, while I'm not sure if this is the best way to tell if your activity is running, see this answer for one method of doing so:
Check whether activity is active
one simple workaround is to catch the exception :
try {
alertDialog.show()
}
catch (WindowManager.BadTokenException e) {
//use a log message
}
It's not elegant but sometimes easy when you have to manage async operations and you are not sure wether activity is up or not when you want to show the dialog.
In my case the issue is occurred because of am trying to open/show dialog box in onPostExecute
AsyncTask
However its an wrong method of showing dialog
or Ui changes in onPostExecute
.
For that, we need to check the activity is in active Eg : !isFinishing()
, if the activity is not finished then only able to show our dialog box or ui change.
@Override
protected void onPostExecute(String response_str) {
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
if (!((Activity) mContext).isFinishing()) {
try {
ShowAgilDialog();
} catch (WindowManager.BadTokenException e) {
Log.e("WindowManagerBad ", e.toString());
}
}
}
});
}
I faced exactly the same issue. Calling '(!isFinishing())'
prevented the crash, but it could not display the 'alert' message.
Then I tried making calling function 'static', where alert is displayed. After that, no crash happened and message is also getting displayed.
For ex:
public static void connect_failure() {
Log.i(FW_UPD_APP, "Connect failed");
new AlertDialog.Builder(MyActivity)
.setTitle("Title")
.setMessage("Message")
.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
//do nothing
}
})
.setIcon(R.drawable.the_image).show();
}
After execute the thread, add these two line of code, and that will solve the issue.
Looper.loop();
Looper.myLooper().quit();
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With