我在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);
有什么想法吗?
任何帮助将不胜感激!
答案 0 :(得分:0)
也许,您获得的日志实际上并非来自您最近开始的任务。它可能来自您之前开始的其他活动。