Лучший способ запустить разные задачи

1

Я разрабатываю приложение для слепых. Я должен постоянно работать с модулем TextToSpeech, GPS и сетевым подключением.

Мне нужно сделать такой запрос: Проконсультируйтесь с GPS, вызовите JSON и вызовите модуль TextToSpeech (TTS).

Мне интересно, как лучше всего решать различные задачи, связанные с основным потоком пользовательского интерфейса. Я видел до сих пор: Объекты Handler и класс AsyncTask.

Мне нужно запускать каждую задачу последовательно, поэтому я хочу вызвать TTS после извлечения данных из сети. Поэтому я использовал "mHandler.post(Runnable)" и внутри этого runnable вызывает другой и т.д.

Однако я видел, что рекомендуется использовать класс AsynTask. Но в этом случае я думаю, что для каждой задачи нужно реализовать другой класс, тогда как я не знаю, будут ли эти задачи выполняться последовательно. Что-то вроде:

AsyntaskClass1 at1;
AsyntaskClass2 at2;
AsyntaskClass3 at3;

at1.execute();
at2.execute();
at3.execute();

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

Спасибо за вашу помощь,

BR.David.

Теги:

3 ответа

0
Лучший ответ

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

Я предлагаю вам объединить все задачи в одну единственную AsyncTask и использовать publishprogress() для обновления пользовательского интерфейса после завершения каждой задачи.

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

например.

public Object doInBackground(Object... params){
   //do task one stuff
   publishProgress(1);
 // do task two stuff
publishProgress(2)
   //do task 3
publishProgress(3)


}
public void onProgressUpdate(Integer... int){
switch(int[0]){
case 1:
//ui update for task 1
case 2:
//ui update for task 3
case 3:
//ui update for task 3
}
1

Вы можете использовать все с одним классом AsyncTask:

private class AsyncTask1 extends AsyncTask<Object, Void, Object> {

 @Override
 protected String doInBackground(Object... args) {
    // Get a result from the GPS.

    // Make a network call

    // Communicate with the TTS 
  }

 @Override
 protected void onPostExecute(Object result) {
     // Return a result to the main thread
     // You are only allowed to touch the UI here
  }

}
0

В вашем примере порядок выполнения не гарантируется. В потоке пользовательского интерфейса будут запущены 3 AsyncTasks. Затем эти три задачи будут выполняться одновременно.

Если вы хотите выполнить код в задачах синхронно, у вас есть хотя бы несколько способов его выполнить:

Объедините три задачи в одну, где вы заказали работу, выполняемую последовательно i.e:

AsyncTaskCombined task = new AsyncTaskCombined();
task.execute();

private class AsyncTaskCombined extends AsyncTask<Void, Void, Void> {
    protected Bitmap doInBackground(Void... urls) {
        // Initialize classes that implement the work logic
        Work1 work1;  
        Work2 work2;
        Work3 work3;
        // Do the work sequentially...
        work1.doWork();
        work2.doWork();
        work3.doWork();
    }
}

Или, возможно, у вас может быть 3 разных AsyncTask, а затем в onPostExecute первой задачи создайте и вызовите вторую AsyncTask, а во второй AsyncTask onPostExecute создайте и вызовите третью и последнюю AsyncTask. Однако это кажется мне немного недоумением...

//Emil H

Ещё вопросы

Сообщество Overcoder
Наверх
Меню