2014-02-20 3 views
-2

Я реализовал внутреннюю AsyncTask для моего класса, которая выполняет первоначальный запрос данных настройки с сервера и сохраняет в кеш устройства. Данные настройки разделяются между двумя файлами JSON. Первый JSON считывается/кэшируется, и если выполняются определенные условия, второй файл JSON будет загружен и сохранен в кеш. Я хочу использовать ту же AsyncTask из обеих операций.Вызов другого обратного вызова от AsyncTask onPostExecute()

В doInBackground(), я выполняю операцию загрузки JSON независимо от типа JSON. Но в onPostExecute() я хочу вызывать разные обратные вызовы в зависимости от того, является ли его первый файл JSON или вторым, так как они требуют различной обработки. Это возможно?

EDIT: примечание Pls Я не хочу использовать booleans, enum, чтобы решить, какой callback для вызова, как в будущем. У меня будет больше файлов для обработки. Из моего класса вызова я хочу установить обратный вызов, и отдых должен произойти автоматически.

+0

Я думаю, что это возможно, так как onPostExcite() будет работать на mainUithread, но попробуйте что-то, если не работает post logcat – murielK

+0

уверен, что это так. например, установить логическое значение в вашем делать в фоновом режиме и включить onPostExecute(), если 1-й JSON или второй JSON ... – StefMa

ответ

1

Ниже реализации должен решить вашу проблему:

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

     private boolean mShouldCallMethod1; 

     public MyCustomAsyncTask(boolean shouldCallMethod1){ 
      mShouldCallMethod1 = shouldCallMethod1; 
     } 

     @Override 
     protected Void doInBackground(Void... params) { 
      //code goes here.. 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
      if(mShouldCallMethod1){ 
       method1(); 
      }else{ 
       method2(); 
      } 
     } 

    } 

т.е. имеет настроенные AsyncTask как InnerClass.

+0

Я должен был упомянуть, я не хочу использовать логическое определение интерфейса, поскольку в будущем мне, возможно, придется выполнить более 2 чтения/кеширования файлов. – Mili

+0

Вместо булевых вы можете передать прослушиватель обратного вызова. Чтобы поддерживать более 2 файлов чтения/кеширования, вы могли передавать слушатели, специфичные для каждого чтения/кеша. Или вы могли бы поддерживать перечисление и иметь один обратный вызов с перечислением как один из аргументов для определения типа чтения/кеша:) – Chandan

+0

У вас есть фрагмент кода для передачи различных прослушивателей обратного вызова? Я столкнулся с кодом, где я могу реализовать интерфейс, но даже в том случае, если у меня нет разных классов с использованием asynctask, это не помогает. – Mili

0

Если вы используете тот же интерфейс, который содержит два обратных вызова, это не проблема. Просто объявите интерфейс с двумя методами обратного вызова (json1, json2) и передайте экземпляр интерфейса в AsyncTask. В вашем onPostExecute() вы можете вызвать обратные вызовы.

+0

PieterAelse: Мне все равно нужно добавить логику как логическое или что-то в onPostExcute, которое решает, какой из двух обратных вызовов между json1 и json2 должен быть вызван? – Mili

+0

Да, у вас есть. «если определенные условия» => логические или проверить Json или что-то решить, что делать точно. – PieterAelse

0

Как андроида не поддерживает методы setListner для onPostExccute так что есть два способа:

  1. Продлить AsychTask и imlement setOnPostExcuteListner
  2. Или просто называют «ваш метод» от onPostExcute простого!
Смежные вопросы