Firebase android Task <t>成功不返回任何内容

时间:2018-08-03 03:39:15

标签: java android firebase firebase-realtime-database task

我正在尝试将我的Firebase数据读入事件列表。由于触发值事件侦听器是异步的,因此我尝试将要返回的列表封装在此任务中。

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;
}

returnEventList中的日志语句可以正确打印,并且 我可以获取所需的事件列表。但是,当我添加onSuccessListener时,所打印的大小将返回0。该列表实际上是空的。不知道这是怎么回事?

1 个答案:

答案 0 :(得分:2)

addListenerForSingleValueEvent()是异步的,这意味着它立即返回 ,而其回调将在未知的时间后被调用。您的代码当前期望在收到数据后仅返回 ,这将永远不会发生。

您的代码应进行重组以使用异步编程,而不是假设一切都将按照您看到的代码行的顺序执行。