Я разрабатываю приложение для слепых. Я должен постоянно работать с модулем 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.
Нет, они будут выполняться почти одновременно... т.е. вторая асинтеза не будет ждать завершения первого.
Я предлагаю вам объединить все задачи в одну единственную 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
}
Вы можете использовать все с одним классом 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
}
}
В вашем примере порядок выполнения не гарантируется. В потоке пользовательского интерфейса будут запущены 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