Android:多个单独的异步任务如何工作?

时间:2016-01-08 09:31:59

标签: android android-asynctask retrofit

在我的Android程序中,我必须进行4或5次网络通话。每个都是独立的,每个都可以独立运行。

public void backGroundTasks() {

    new AsyncTasks<Void, Void, Void>() {

        @Override
        protected Void doInBackground(Void... params) {
            try {

                List<User> users = RetrofitAdapter.getClient().getUsersSync();

                saveToDB(users);

            } catch (RetrofitError error) {
                error.printStackTrace();
            }
            return null;
        }
    }.execute();

    new AsyncTasks<Void, Void, Void>() {

        @Override
        protected Void doInBackground(Void... params) {
            try {

                List<Media> contents = RetrofitAdapter.getClient().getContentsSync();

                saveToDB(contents);

            } catch (RetrofitError error) {
                error.printStackTrace();
            }
            return null;
        }
    }.execute();

    new AsyncTasks<Void, Void, Void>() {

        @Override
        protected Void doInBackground(Void... params) {
            try {

                Profile profile = RetrofitAdapter.getClient().getProfile();

                saveToDB(profile);

            } catch (RetrofitError error) {
                error.printStackTrace();
            }
            return null;
        }
    }.execute();

    new AsyncTasks<Void, Void, Void>() {

        @Override
        protected Void doInBackground(Void... params) {
            try {

                List<Message> messages = RetrofitAdapter.getClient().getMessages();

                saveToDB(messages);

            } catch (RetrofitError error) {
                error.printStackTrace();
            }
            return null;
        }
    }.execute();

}

我的问题是,

AsyncTask如何运作? 将以并行执行?或将被调用,但 网络请求 将排队?

在他们提到的一些SO答案中,他们使用AsyncTasks执行executeOnExecutor()。这种情况会有所帮助吗?

注意: 我使用Retrofit库来简化REST调用。它有什么问题吗?

3 个答案:

答案 0 :(得分:1)

  

这个AsyncTask如何工作?将并行执行吗?

由于蜂窝状它们将按顺序执行,但如果你将使用executeOnExecutor,那么它们将被并行执行。

  

或将被调用,但网络请求将排队?

它们将排队,没有网络操作将启动,直到AsyncTask将轮到它。

内部AsyncTasks使用Executors。您的任务仅执行网络操作,因此您可以切换到执行程序。如果您想以串行方式进行网络操作,那么您也可以考虑使用IntentService

答案 1 :(得分:1)

这是 Arhimed 的答案。他解释得很好。

AsyncTask使用线程池模式来运行doInBackground()中的东西。问题最初(在早期的Android OS版本中)池大小只有1,这意味着没有对一堆AsyncTasks进行并行计算。但后来他们修复了这个问题,现在大小为5,所以最多可以同时运行5个AsyncTasks。不幸的是,我不记得他们究竟改变了什么版本。

要查看他的answer

答案 2 :(得分:1)

带有Executors

AsyncTasks就像魅力一样。它同时执行网络请求。

来自文档,

  

自Honeycomb以来,调用AsyncTask的executeOnExecutor()代替execute()将并行执行任务。

     

AsyncTask.THREAD_POOL_EXECUTOR

     

可用于并行执行任务的执行程序。