Java 异步任务中调用对话框引发令牌错误
我有一个活动,它在启动时立即调用服务器查询。下面是它的代码 现在假设它启动了Java 异步任务中调用对话框引发令牌错误,java,android,eclipse,Java,Android,Eclipse,我有一个活动,它在启动时立即调用服务器查询。下面是它的代码 现在假设它启动了AsyncTask,我在onSuccess中得到了响应。在收到回复之前,如果我完成了活动,请按后退按钮 现在仍然会调用回调,并且显示对话框会抛出错误的令牌异常。无法添加窗口令牌,您的活动正在运行。如果我按下后退按钮,onSuccess停止执行,我如何中断此异步任务I-e ResponseCallback callback = new ResponseCallback() { @SuppressWarnings(
AsyncTask
,我在onSuccess中得到了响应。在收到回复之前,如果我完成了活动,请按后退按钮
现在仍然会调用回调,并且显示对话框会抛出错误的令牌异常。无法添加窗口令牌,您的活动正在运行。如果我按下后退按钮,onSuccess
停止执行,我如何中断此异步任务I-e
ResponseCallback callback = new ResponseCallback()
{
@SuppressWarnings("deprecation")
@Override
public void onSuccess(String response)
{
dialog = new AlertDialog.Builder(Chat.this).setMessage("BLABLA")
.setTitle("Invite!")
.setCancelable(true)
.setPositiveButton(android.R.string.ok,
new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialog, int whichButton)
{
dialog.cancel();
sendInvite();
}
})
.setNegativeButton(android.R.string.cancel,
new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialog, int whichButton)
{
dialog.cancel();
}
})
.show();
}
else
{
}
@Override
public void onFailure(String exception)
{}
};
new MyAsyncTask(queryString, callback);
不久前我发现了一个类似的问题。解决这个问题的一个简单方法是在
onBackPressed()中将某个变量设置为true
然后在您的onSuccess
中,您只需检查isFinishing是否为true
编辑:您还可以使用:
if(Chat.this.isFinishing())
在您的onSuccess
中,但我不确定在调用finish()
时是否会返回true,因为doBackground()
已经执行,所以您不能取消任务。
你必须给自己写一张支票。例如,您可以将activitydestromed
布尔字段添加到AsyncTask
,初始化为false
。在活动的onDestroy()
调用中将其设置为true
。然后,您可以在显示或不显示对话框之前检查状态
if (!activityDestroyed) {
dialog = new AlertDialog.Builder(Chat.this).setMessage("BLABLA")
.setTitle("Invite!")
.setCancelable(true)
.setPositiveButton(android.R.string.ok,
new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialog, int whichButton)
{
dialog.cancel();
sendInvite();
}
})
.setNegativeButton(android.R.string.cancel,
new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialog, int whichButton)
{
dialog.cancel();
}
})
.show();
}
编辑:您应该能够通过使用AsyncTask.cancel()
和AsyncTask.isCancelled()
以更合适的方式实现这一点,即使返回,任务仍在执行。我想正确的方法是中止与服务器的http连接
您可以让您的AsyncTask
实现一个接口,例如:OnTaskCanceledListener
使用一个方法:onTaskCanceled()
。
onTaskCanceled()
的实现应该如下所示(伪代码):
现在,当返回到上一个活动时,从AsyncTask
调用onTaskCanceled()
回调。
这样,您就不应该通过onSuccess()
您是否尝试过重写onBackPressed()
并在AsyncTask
上调用cancel()
;可以将.show()包装在try/catch
中。如果活动
已关闭,则应防止其显示。我认为,作为一种预防措施,我不确定这是否是您所需要的全部。我知道大多数时候你都想阻止异常,但在这种情况下,我看不出有什么害处。如果无法附加对话框
,则取消并不显示该对话框
if (!activityDestroyed) {
dialog = new AlertDialog.Builder(Chat.this).setMessage("BLABLA")
.setTitle("Invite!")
.setCancelable(true)
.setPositiveButton(android.R.string.ok,
new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialog, int whichButton)
{
dialog.cancel();
sendInvite();
}
})
.setNegativeButton(android.R.string.cancel,
new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface dialog, int whichButton)
{
dialog.cancel();
}
})
.show();
}
@Override
public void onTaskCanceled(){
httpRequest.abort();
}