I am trying to read my firebase data into a list of events. Since the firing of value event listener is asynchronous I tried to encapsulate the List I want returned inside this task.
Task<List<Event>> task = Tasks.call(new ReturnEventList(mDatabaseRef.child("Events")));
task.addOnSuccessListener(new OnSuccessListener<List<Event>>() {
@Override
public void onSuccess(List<Event> events) {
Log.i(TAG,"size " + events.size());
for (Event event : events) {
Log.i(TAG,event.toString());
}
}
});
ReturnEventList:
class ReturnEventList implements Callable<List<Event>> {
private static final String TAG = "ReturnEventList";
DatabaseReference mDatabaseRef;
public ReturnEventList(DatabaseReference mDatabaseReference) {
this.mDatabaseRef = mDatabaseReference;
}
@Override
public List<Event> call() throws Exception {
List<Event> events = new ArrayList<>();
mDatabaseRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Log.i(TAG,dataSnapshot.toString());
for (DataSnapshot childSnapshot : dataSnapshot.getChildren()) {
Log.i(TAG,childSnapshot.toString());
Event event = childSnapshot.getValue(Event.class);
events.add(event);
Log.i(TAG,event.toString());
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
return events;
}
The log statements inside returnEventList prints correctly and I'm able to get the list of events that I want. However when I add a onSuccessListener the size I print returns me 0. The list is practically empty. Not sure what is going on here ?