2016-01-08 2 views
0

В моей программе Android я должен выполнить 4 или 5 сетевых вызовов. Каждый из них независим, и каждый может работать самостоятельно.Android: Как работают несколько отдельных задач async?

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 работа? Будет выполнен в parallel? или Будет вызван, но Сетевые запросы будет поставлен в очередь?

В некоторых ответах SO, о которых они упоминали, выполнить AsyncTasks с executeOnExecutor(). Помог ли он этому сценарию?

Примечание: Я использую библиотеку дооснащения для упрощения вызовов REST. У этого есть что-нибудь с этой проблемой?

+0

Что именно * есть * проблема? –

ответ

1

Как работает этот AsyncTask? Будет выполняться параллельно?

Поскольку соты будут выполняться серийно, но если вы будете использовать executeOnExecutor, они будут выполняться параллельно.

или Будет вызвано, но запросы сети будут поставлены в очередь?

они будут поставлены в очередь, никакая сетевая операция не начнется, пока AsyncTask не примет свою очередь.

Internal AsyncTasks использует Executors. Ваши задачи выполняют только сетевую операцию, поэтому вы можете переключиться на Executors. Если вы хотите последовательно выполнять сетевые операции, вы можете также рассмотреть возможность использования IntentService.

1

Это ответ Arhimed. Он объяснил это хорошо.

AsyncTask использует шаблон пула потоков для запуска материала из doInBackground(). Первоначально проблема (в ранних версиях ОС Android) размер пула был всего 1, что означает отсутствие параллельных вычислений для группы AsyncTasks. Но позже они исправили это, и теперь размер 5, поэтому максимум 5 AsyncTasks могут выполняться одновременно. К сожалению, я не помню, в какой версии именно они изменили это.

Для более проверить его answer

1

Executors с AsyncTasks работает как шарм. Он выполняет сетевые запросы одновременно.

Из документов,

С Honeycomb, вызывая AsyncTask-х executeOnExecutor() вместо execute() будет выполнять задачи параллельно.

AsyncTask.THREAD_POOL_EXECUTOR

душеприказчик, который может быть использован для выполнения задач параллельно.

Смежные вопросы