Android AsyncTask 等待/排队

Mur*_*ro2 1 queue android wait runnable android-asynctask

我有一个扩展 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我上面的 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);
}
Run Code Online (Sandbox Code Playgroud)

这是我用来调用异步的方法。

正如您在我用来调用服务的方法中看到的那样,我每次都初始化 RunnableTask 的一个新实例。

它的表现如何:

  • 长请求将转到 Web 服务并开始它的 30 秒处事。

  • 10 秒后,我的快速小 PUT 创建了它的对象,然后调试器显示的最后一件事是“new RunnableTask().execute(obj);”上的断点。线,然后它就消失了。

  • 20 秒后,我的 RunnableTasks doInBackground 方法的第一行将命中并执行 PUT。

请问有人可以帮忙吗?或者至少告诉我我在做一些非常愚蠢的事情..

Mob*_*ert 5

您可以使用 executeOnExecutor 执行多个 AsyncTask

 if( Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB ) {
    new MyAsyncTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
} else {
    new MyAsyncTask().execute();
}
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请查看AsyncTask 文档