如何在后台任务完成后在当前活动中显示警报对话框

时间:2016-11-02 13:06:51

标签: java android

我正在尝试付款,这需要花费更多时间才能完成,我不希望用户留在视图上,直到他们看到成功消息,所以一旦他们点击后台任务中的付款按钮就执行我显示弹出窗口“处理您的付款”。一旦用户单击“确定”,它们将被导航到不同的视图。一旦后台任务完成,我想在当前视图中再显示一条“你的付款成功”的弹出窗口。

以下是代码段

private class payment extends AsyncTask<Void, Void, Void>
{
        payment() {
        }
        @Override
        protected void onPreExecute() {
            AlertDialog.Builder successDialog=new  AlertDialog.Builder(PayActivity.this);
            successDialog.setMessage("Processing your payment");
            successDialog.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.cancel();
                    Intent lResultIntent = new Intent();
                    setResult(RESULT_OK, lResultIntent);
                    finish();
                }

            });

            successDialog.show();
        }

        @Override
        protected Void doInBackground(Void... params) {

           // .....
        }

        @Override
        protected void onPostExecute(Void result) {

            Log.i("MSG","inside post");
            AlertDialog.Builder success = new AlertDialog.Builder(EditCardActivity.this);
                    success.setMessage("Your payment was successful");
                    success.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            dialog.cancel();
                        }

                    });
                    success.show();
        }
    }

注意

当我尝试运行此代码时,我收到“E / UncaughtException:android.view.WindowManager $ BadTokenException:无法添加窗口 - 令牌android.os.BinderProxy@a38​​eb5无效;您的活动是否正在运行?”

所以我用Google搜索并找到了

if(!isFinishing()) {success.show();} 

但它没有帮助,当我记录isFinishing()它打印为true。这个问题可能重复我看到很多Q / A类似于这个例外。我尝试了大部分。不确定我错过了什么。我来到这里。任何建议或不同的方法都会有所帮助。谢谢!

1 个答案:

答案 0 :(得分:0)

问题在于onPreExecute方法,因为调用finish()方法但AsyncTask仍在运行。

在点击Ok按钮上的当前活动之前,请致电AsyncTask.cancel

....
setResult(RESULT_OK, lResultIntent);
payment.this.cancel(true);
finish();

在显示来自isCancelled()

的提醒之前,请先在onPostExecute中添加签到
if(!this.isCancelled()){
   // show Alert Here
}