2016-09-18 4 views
-3

В методе OnCreate я вызвал 3 AsyncTask, который в основном заполняет данные для 3 Spinners. Мне нужно, чтобы у меня была кнопка входа в систему, пока все 3 задачи не закончились. Как я могу это достичь?Дождитесь окончания AsyncTask

  new SpinnerDataFetcher("GetFreeDrivers1",(Spinner)findViewById(R.id.Spinner_1)).execute(); 

      new SpinnerDataFetcher("GetFreeDrivers2",(Spinner)findViewById(R.id.Spinner_2)).execute(); 

      new SpinnerDataFetcher("GetFreeDrivers3",(Spinner)findViewById(R.id.Spinner_3)).execute(); 
+0

вам не следует использовать AsyncTask, если вы пытаетесь загрузить некоторые данные, попробуйте вместо этого использовать AsyncTaskLoader. – Lazai

ответ

0

Просто увеличивает число, которое соответствует на сколько AsyncTask сделаны.

 int s = 0; 

     @Override 
     public void onCreate(@Nullable Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 

      new SpinnerDataFetcher(){ 
       @Override 
       protected void onPostExecute(....) { 
        super.onPostExecute(...); 
        s++; 
        check(); 
       } 

      }.execute(); 

      new SpinnerDataFetcher(){ 
       @Override 
       protected void onPostExecute(....) { 
        super.onPostExecute(...); 
        s++; 
        check(); 
       } 

      }.execute(); 

      new SpinnerDataFetcher(){ 
       @Override 
       protected void onPostExecute(....) { 
        super.onPostExecute(...); 
        s++; 
        check(); 
       } 

      }.execute(); 

     } 

     public void check(){ 
      if(s >=3){ 
      s= 0; 
      // enable button here 
      } 
     } 
0

Для этого нужно отключить Button перед вызовом new Spinner1DateFetcher и позвонить Second из Spinner1DateFetcher метода onPostExecute и так же, как Third Spinner метод и в Third SpinneronPostExecute установить Button в Enable ..

Для Отключить кнопки использования

Button.setEnabled(false); 

и для Enable Button использование

Button.setEnabled(true); 

Edit:

для параметра проверки необходимо добавить Constuctor и проверить состояние, как показано ниже образом.

private class MyAsyncTask extends AsyncTask<Void, Void, Void> { 

    public MyAsyncTask(boolean showLoading) { 
     super(); 
     // do stuff 
    } 

    // doInBackground() et al. 
} 
+1

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

+0

@AkshayJ см. Мой ответ на вопрос. – Ironman

+0

Ваш ответ предполагает рекурсивный вызов функции execute(). Но аргумент разный для 3 вызовов. Как я это обработаю. –

0

Инициализируйте экземпляр AsyncTask ссылкой на объект Activity/Fragment, который его создает. Затем сигнал обратно в onPostExecute, когда его сделано

например.

class Spinner1DataFetcher extends AsyncTask<...> { 
     public Spinner1DataFetch(YourActivityOrFragment activity) { 
      _activity = activity; 
     } 

     protected void onPostExecute(...) { 
      _activity.spinner_1_is_done(); 
     } 
} 
0

Существует несколько способов достижения этого.

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

final InterfaceTrigger trigger = new InterfaceTrigger(); 

new AsyncTask<>() { 
    @Override 
    protected void onPostExecute(Object o) { 
     super.onPostExecute(o); 
     trigger.finishJob(); 
     if (trigger.isTimeToUpdateUi()) { 
      // TODO update your UI 
     } 
    } 
    }; 

public class InterfaceTrigger { 
    private static final int THRESHOLD = 3; 
    private int counter; 

    public synchronized void finishJob() { 
     counter++; 
    } 

    public synchronized boolean isTimeToUpdateUi() { 
     return counter == THRESHOLD; 
    } 
} 

Другой способ заключается в использовании CyclicBarier и ExcutorService механизм.

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