Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 异步任务中调用对话框引发令牌错误_Java_Android_Eclipse - Fatal编程技术网

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();
}