0

我有一个活动,当它开始时立即调用服务器查询。下面是它的代码。

现在假设它开始了AsyncTask,我在 onSuccess 中得到响应。在我得到响应之前,如果我完成了活动,即按下后退按钮。

现在回调仍然会被调用并且显示对话框会抛出错误的令牌异常。无法添加窗口令牌,您的活动是否正在运行。我怎样才能中断这个 AsyncTask 即如果我按下后退按钮执行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);
4

3 回答 3

0

不久前我发现了一个类似的问题。解决它的一个简单方法是将某个变量设置为 trueonBackPressed()

@Override
public void onBackPressed() {
    isFinishing = true;
    finish();
 }

然后在你的onSuccess你只需要检查 isFinishing 是否为真。

编辑:您也可以使用:

if(Chat.this.isFinishing())

在你的onSuccess,但我不确定这是否会在你调用时返回 true finish()

于 2013-06-20T15:19:54.170 回答
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()

于 2013-06-20T15:21:38.773 回答
0

即使你回去,任务仍在执行。我想正确的方法是中止与服务器的 http 连接。

您可以让您AsyncTask实现一个接口,例如:OnTaskCanceledListener使用单个方法:onTaskCanceled()。的实现onTaskCanceled()应该如下所示(伪代码):

@Override 
public void onTaskCanceled(){
   httpRequest.abort();
}

现在,当返回上一个活动时,onTaskCanceled()AsyncTask. 这种方式,你不应该通过onSuccess()

于 2013-06-20T15:25:27.113 回答