我有一个类扩展AsyncTask,它将消息发送到WCF Web服务。一个接一个的简单消息可以正常工作,但是如果我在新线程上发送消息需要30秒才能完成,那么在我发送快速请求的过程中,它将不会执行AsyncTask,直到长消息返回。
我认为AsyncTask的整个想法是这两个消息会在不同的线程上运行,因此不会堆叠?
这是我的代码:
private class RunnableTask extends AsyncTask<RunnableObj, RunnableObj, RunnableObj> {
@Override
protected RunnableObj doInBackground(RunnableObj... params) {
try {
if (params[0].requestBody != (null)) {
params[0].request.body(new JSONObject(params[0].requestBody));
}
params[0].request.asVoid();
return params[0];
}
catch (Throwable e) {
params[0].handler.onFailure(e);
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(RunnableObj runnableObj) {
super.onPostExecute(runnableObj);
runnableObj.handler.onSuccess();
}
}
这是我上面的AsyncTask。
public void put(final String urlStr, final String requestBody, final HttpResponseHandler httpResponseHandler) {
RunnableObj obj = new RunnableObj();
obj.handler = httpResponseHandler;
obj.request = webb.put(urlStr)
.header(ServiceConstants.SessionTokenHeader, MyApplication.getSessionToken())
.ensureSuccess();
obj.requestBody = requestBody;
new RunnableTask().execute(obj);
}
这是我用来调用Async的方法。
正如您在用于调用服务的方法中所看到的,我每次都初始化一个RunnableTask的新实例。
它的表现如何:
请有人帮忙吗?或者至少告诉我,我做的事情非常愚蠢..
您可以使用executeOnExecutor执行多个AsyncTask
if( Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB ) {
new MyAsyncTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
} else {
new MyAsyncTask().execute();
}
有关更多信息,请查看AsyncTask documentation
首次引入时,AsyncTasks在单个后台线程上串行执行。从DONUT开始,这被改为一个线程池,允许多个任务并行运行。从HONEYCOMB开始,任务在单个线程上执行,以避免由并行执行引起的常见应用程序错误。
如果您真的想要并行执行,可以使用THREAD_POOL_EXECUTOR调用executeOnExecutor(java.util.concurrent.Executor,Object [])。
如您所见,AsyncTasks目前仅在单个后台线程上运行,这意味着多个排队任务必须一个接一个地触发。如果您想执行并发任务,您需要按照上面的说明操作。