2017-02-08 4 views
1

Я пытаюсь выяснить, как что-то сделать с данными, возвращаемыми с AsyncTask.Обработка данных, возвращаемых задачей Async (Firebase)

У меня есть активность, в которой я вызываю операцию async Firebase get (операция, существующая в другом классе), и я хочу обновить TextView, существующий в Activity, с размером полученного ArrayList. Вот мой Firebase вызов, получить называется в OnCreate активность:

public void getAttendants() { 

    ArrayList<AttendModel> attendees = new ArrayList<AttendModel>(); 
    FirebaseConnection.getInstance().getAllAttendeesFor(uuid, attendees); 

    Log.d("attendees", String.valueOf(attendees.size())); 
} 

и вот моя Firebase операция:

public void getAllAttendeesFor(String UUID, final ArrayList<AttendModel> attendArray) { 
    final DatabaseReference attendObjects = getDatabaseTableWith(Constants.tableAttendObject); 

    Query queryRef = attendObjects.orderByChild(Constants.taAttendObjectUUID).equalTo(UUID); 

    queryRef.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 

      for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) { 
       HashMap<String, Object> attend = (HashMap<String, Object>) postSnapshot.getValue(); 
       String UUID = (String) attend.get(Constants.taAttendObjectUUID); 
       String userUsername = (String) attend.get(Constants.AttendObjectUserUsername); 

       AttendModel attendModel = new AttendModel(userUsername, UUID); 
       attendArray.add(attendModel); 

//here would like to notify or somehow return the attendArray 
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 

} 

Каков наилучший подход этого в Android? Есть ли возможность реализовать адаптер типа или обработчик завершения?

+0

'ValueEventListener.onDataChange' * есть * обработчик завершения. Рассматривали ли вы возможность обновить текстовое представление изнутри? –

+0

Я сделал, но на данный момент у меня есть класс, где я выполняю все свои операции Firebase и хотел бы иметь элегантный способ вернуть значение обратно в класс, который он вызвал (таким образом я устраняю избыточность кода в других классах, что, возможно, мне понадобится выполнить одну и ту же операцию) – John

+0

есть способ, которым я могу самостоятельно создать обработчик завершения для моей функции, который будет вызываться в 'onDataChange'? – John

ответ

3

Что вы ищете - это интерфейс обратного вызова, так как для ваших нужд вам нужен простой интерфейс, который реализует единый метод с одним параметром, так как для Java 6 (версия Android Java) нет никакого соглашения о выпуске, вы можете легко создать это самостоятельно:

interface Callback { 

void act(List<AttendModel> models); 
} 

передать его как аргумент методу обертывания firebase и называть его результатом.

public void getAllAttendeesFor(String UUID, final ArrayList<AttendModel> attendArray, final Callback callback) { 
    final DatabaseReference attendObjects = getDatabaseTableWith(Constants.tableAttendObject); 

    Query queryRef = attendObjects.orderByChild(Constants.taAttendObjectUUID).equalTo(UUID); 

    queryRef.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 

      for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) { 
       HashMap<String, Object> attend = (HashMap<String, Object>) postSnapshot.getValue(); 
       String UUID = (String) attend.get(Constants.AttendObjectUUID); 
       String userUsername = (String) attend.get(Constants.AttendObjectUserUsername); 

       AttendModel attendModel = new AttendModel(userUsername, UUID); 
       attendArray.add(attendModel); 

       callback.act(attendArray) 
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 

} 

затем в верхнюю часть метода уровня:

public void getAttendants() { 

    ArrayList<AttendModel> attendees = new ArrayList<AttendModel>(); 
    FirebaseConnection.getInstance().getAllAttendeesFor(uuid, attendees, 
     new Callable<List<AttendModel) { 
      void act(List<AttendModel> attendees){ 
      //here you can update the UI 
      Log.d("attendees", String.valueOf(attendees.size())); 
      } 
     }; 


} 

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

+1

"вы можете обновить интерфейс только в том случае, если метод onDataChange запроса firebase вызывается в основном потоке" Это так. –

+0

ну, отлично! просто хотел указать на эту проблему. – yosriz

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