AsyncTask使用相同的线程并排队我的所有请求

时间:2018-04-06 15:24:51

标签: java android android-asynctask android-thread

在我的Android应用程序中,我发现我的所有api调用都在排队而不是同时发生。我假设他们都被发布到同一个帖子中,而我的印象是AsyncTaskdoInBackground()创建了新的主题。

public class API extends AsyncTask<String, String, String> {
    public interface Listener {
        void completedWithResult(JSONObject result);
    }
    public Listener listener;
    @Override
    protected String doInBackground(String... strings) {
        if(!canMakeRequest()){
            return internetError().toString();
        }
        String action = strings[0];

        Log.i("API", action +" Sent");
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        Log.i("API", action +" Received");
        return "";
    }

    @Override
    protected void onPostExecute(String json) {
        JSONObject obj;
        obj = new JSONObject(json);
        if(listener != null)listener.completedWithResult(obj);
    }
}

在我的应用程序的一大堆地方,我有类似的东西:

API api = new API();
api.listener = new API.Listener() {
    @Override
    public void completedWithResult(JSONObject result) {
        Log.i(tag, "Returned with "+result);
    }
};
api.execute("update-address/");

我总是创建一个API的新实例,但我的日志中所有这些调用都是串行发生而不是并行:

analytics/log/ Sent
analytics/log/ Returned
get-beta-tester Sent
get-beta-tester Returned
get-following Sent
get-following Returned
get-groups Sent
get-groups Returned
get-follow-requests Sent
get-follow-requests Returned
get-followers Sent
get-followers Returned
analytics/log/ Sent
analytics/log/ Returned
analytics/log/ Sent
analytics/log/ Returned
post-session Sent
post-session Returned
analytics/log/ Sent
analytics/log/ Returned
post-session Sent
post-session Returned
analytics/log/ Sent
analytics/log/ Returned
analytics/log/ Sent
analytics/log/ Returned
unregister-GCM Sent
unregister-GCM Returned
analytics/log/ Sent
analytics/log/ Returned
verify Sent
verify Returned

3 个答案:

答案 0 :(得分:1)

见这里:

https://developer.android.com/reference/android/os/AsyncTask.html

  

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

,解决方案是:

  

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

api.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, "update-address/");

答案 1 :(得分:1)

调用execute使AsyncTasks在单个后台线程上串行执行。

来自AsyncTask's documentation

  

执行顺序

     

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

     

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

所有这些混乱是我停止使用AsyncTask的原因之一。

答案 2 :(得分:0)

即使我想与你的相同,也尝试过AsyncTask。后来了解了Executors Thread Pool。我建议你使用ThreadPool,它将同时发生,你可以管理正在创建的线程。

//Sample snapshot
ExecutorService pool = Executors.newCachedThreadPool();//or fixed thread pool

pool.execute(new Runnable() {
                @Override
                public void run() {
                    //Do your tasks
                }
            });

这会对您有帮助,ThreadPoolExecutor