在AsyncTask中调用Dialog抛出令牌错误

时间:2013-06-20 15:07:01

标签: java android eclipse

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

现在假设它启动了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);

3 个答案:

答案 0 :(得分:0)

我前段时间发现了类似的问题。解决它的一种简单方法是在onBackPressed()

中将某个变量设置为true
@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}}