java - Firebase android Task<T> 成功后不返回任何内容

标签 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());
            }
        }
    });

返回事件列表:

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。该列表实际上是空的。不确定这里发生了什么?

最佳答案

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

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

关于java - Firebase android Task<T> 成功后不返回任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51664976/

相关文章:

java - 将 Ecmascript (Java,javascript,Actionscript) 知识翻译为 Objective C

android - 如何为 firebase 创建自定义用户属性?

java - 如何获取当前用户的 Firebase token

java - 如何在 cucumber 中重新运行失败的方案

java - 如何解决时间戳java + firestore问题?

android - GrantPermissionRule 停止工作

java - 安卓 AllowBackup 错误

javascript - 在 polymer 中的多个组件中初始化一个 Firebase 应用程序是否错误?

node.js - Stripe PaymentIntent.create 导致 TypeError : Cannot read property 'create' of undefined (google cloud functions)

java - @QueryResult 映射错误