Android AsyncTask等待/排队

时间:2016-01-20 15:32:25

标签: android android-asynctask queue wait runnable

我有一个扩展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);
}

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

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

表现如何:

  • 长请求将转到Web服务并启动它30秒的操作。

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

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

请有人帮忙吗?或者至少告诉我,我做了一件非常愚蠢的事情......

2 个答案:

答案 0 :(得分:3)

您可以使用executeOnExecutor

执行多个AsyncTask
 if( Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB ) {
    new MyAsyncTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
} else {
    new MyAsyncTask().execute();
}

有关详情,请查看AsyncTask documentation

答案 1 :(得分:0)

根据AsyncTask Docs

  

首次引入时,AsyncTasks在单个上串行执行   背景线程。从DONUT开始,这被改成了一个池   允许多个任务并行运行的线程。从...开始   HONEYCOMB,任务在单个线程上执行以避免常见   并行执行导致的应用程序错误。

     

如果您真的想要并行执行,可以调用   executeOnExecutor(java.util.concurrent.Executor,Object [])with   THREAD_POOL_EXECUTOR。

如您所见,AsyncTasks目前仅在单个后台线程上运行,这意味着多个排队任务必须一个接一个地触发。如果您想执行并发任务,则需要按照上述说明进行操作。