我正在尝试付款,这需要花费更多时间才能完成,我不希望用户留在视图上,直到他们看到成功消息,所以一旦他们点击后台任务中的付款按钮就执行我显示弹出窗口“处理您的付款”。一旦用户单击“确定”,它们将被导航到不同的视图。一旦后台任务完成,我想在当前视图中再显示一条“你的付款成功”的弹出窗口。
以下是代码段
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@a38eb5无效;您的活动是否正在运行?”
所以我用Google搜索并找到了
if(!isFinishing()) {success.show();}
但它没有帮助,当我记录isFinishing()它打印为true。这个问题可能重复我看到很多Q / A类似于这个例外。我尝试了大部分。不确定我错过了什么。我来到这里。任何建议或不同的方法都会有所帮助。谢谢!
答案 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
}