我有一个活动,当立即启动时会调用服务器查询。下面是它的代码。
现在假设它启动了AsyncTask
并且我在onSuccess中得到了响应。在我得到回应之前,如果我非常活跃,请按后退按钮。
现在仍然会调用回调并显示对话框会引发错误的令牌异常。无法添加窗口令牌,您的活动是否正在运行。如何中断AsyncTask i-e如果按下后退按钮,onSuccess
的执行会停止执行?
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);
答案 0 :(得分:0)
我前段时间发现了类似的问题。解决它的一种简单方法是在onBackPressed()
@Override
public void onBackPressed() {
isFinishing = true;
finish();
}
然后在你的onSuccess
中,你只需要检查isFinishing是否为真。
编辑:你也可以使用:
if(Chat.this.isFinishing())
在您的onSuccess
中,但我不确定您是否会在致电finish()
后立即返回。
答案 1 :(得分:0)
您不能取消任务,因为doBackground()
已经执行过。
你必须自己编码支票。例如,您可以向activityDestroyed
添加AsyncTask
布尔字段,初始化为false
。在活动的true
调用中将其设置为onDestroy()
。然后,您可以在显示或不显示对话框之前检查状态。
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()
答案 2 :(得分:0)
即使你回去,任务仍然在执行。我想正确的方法是中止与服务器的http连接。
您可以让AsyncTask
使用单一方法OnTaskCanceledListener
实现一个界面,例如:onTaskCanceled()
。onTaskCanceled()
。
@Override
public void onTaskCanceled(){
httpRequest.abort();
}
的实现看起来像这样(伪代码):
onTaskCanceled()
现在,当回到之前的活动时,请从AsyncTask
致电onSuccess()
回调。
这样,您就不应该通过{{1}}