我有一个进行异步连接的活动,如下所示:

    new Thread(new Runnable() {
        public void run() {
            try{
                //Make Connection
            }catch(Exception e){
                runOnUiThread(new Runnable() { public void run() {
                     Dialogs.showErrorDialog(MyActivity.this); //I display an error dialog using this context
                } });
            }
        }
    }).start();


想象一下,连接速度真的很慢,我离开了启动该线程的活动。如果连接最终顺利,则一切都很好,但是如果连接失败,则启动对话框时它将崩溃,因为上下文不再存在。错误是:

android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@4068a558 is not valid; is your activity running?


如何避免这个错误?我想检测我的活动是否仍然有效

1)显示具有此上下文的对话框(如果我仍在屏幕上)

2)显示带有ApplicationContext的Toast(如果我在屏幕之外)

编辑:
对话框代码是这样的:

static public void showErrorDialog(Context context){
    AlertDialog.Builder builder = new AlertDialog.Builder(context);
    builder.setIcon(android.R.drawable.ic_dialog_alert);
    builder.setTitle(R.string.error_title);
    builder.setMessage(R.string.error_content);
    builder.setPositiveButton(R.string.button_ok,null);
    builder.show();
}

最佳答案

如何避免这个错误?


我建议您使用此:

runOnUiThread(new Runnable() {
   public void run() {
      if (!(((Activity) context).isFinishing())) { // you need to pass Context.
         Dialogs.showErrorDialog(context);
      }
   }
});


让我知道它是否有效。

注意:如果无法使用,我建议您使用AsyncTask而不是runOnUiThread()

10-07 19:15
查看更多