android - AsyncTask由于某种原因被取消

时间:2015-12-24 14:16:52

标签: android multithreading android-asynctask task handler

我在android中有一个AsyncTask类,用于来自服务器的各种请求 - 重要的是指出我的请求不是并行工作,每个请求都会将数据加载到活动中并在加载数据后 - >用户可以浏览另一个发送另一个请求的活动。

我还有一个 TaskCanceler ,负责取消 AsyncTask,如果花费的时间超过8秒。

问题 -

出于某种原因,当我打开应用程序并在之间浏览时,可以说,5-6个活动,可能会更少或更多, (每个Activity向服务器发送请求 - >等待响应 - >使用数据填充Activity),在某些时候我转到Activity并开始加载数据,然后,在大约1之后第二个,我看到了OnCancelled()错误消息("no connection to server!")

这意味着OnCancelled()已被调用 - TaskCenceler 只能在 8秒后调用它

我检查了,服务器回答了所有请求 - 但是Android应用程序只是“不等待”其中一个请求无处不在。

为什么会这样?它不是特定于一个活动,每次它发生在另一个活动上。为什么突然 TaskCenceler 不等到完整的8秒?

我的AsyncTask:

private class executeRequest extends AsyncTask<HttpRequest, Void, Integer> {

    private ResponseListener listener;

    public executeRequest(ResponseListener responseListener) {
        listener = responseListener; 
        // Listener in the Activity to respond to Error/Success 
    }

    @Override
    protected void onCancelled() {
        handleCancelled();
        // if more than 8 seconds passed
    }

    private void handleCancelled() {
        if (taskCanceler != null && handler != null) {
            handler.removeCallbacks(taskCanceler);
        }
        listener.onError("no connection to server!");
    }

    @Override
    protected Integer doInBackground(HttpRequest... params) {
        // TODO Auto-generated method stub
        HttpRequest request = params[0];
        int responseCode = -1;
        HttpResponse response;
        responseResult = "";
        response = httpClient.execute((HttpUriRequest) request);
        responseCode = response.getStatusLine().getStatusCode();
        responseResult = EntityUtils.toString(response.getEntity(),
                    HTTP.UTF_8);
        return responseCode;
    }

    @Override
    protected void onPostExecute(Integer result) {
          // handle response
    }
}

TaskCanceller:

public class TaskCanceler implements Runnable {
    public executeRequest task;

    public TaskCanceler() {
    }

    public void setTask(executeRequest task) {
        this.task = task;
    }

    @Override
    public void run() {
        if (task != null)
            if (task.getStatus() == AsyncTask.Status.RUNNING) {
                task.onCancelled();
            }
    }
}

这是我开始完成所有任务的方式:

// Setting up the Handler  and the TaskCanceler
private Handler handler = new Handler();
private TaskCanceler taskCanceler = new TaskCanceler();

task = new executeRequest(responseListener, type);
taskCanceler.setTask(task);
handler.postDelayed(taskCanceler, 8 * 1000); // cancel after 8 seconds
task.execute(refuseJoinRide);

有什么想法吗?

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

也许,您获得的日志实际上并非来自您最近开始的任务。它可能来自您之前开始的其他活动。