【问题标题】:Firebase android Task<T> on success not returning anythingFirebase android Task<T> 成功不返回任何内容
【发布时间】:2018-08-03 03:39:14
【问题描述】:

我正在尝试将我的 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。该列表实际上是空的。不知道这里发生了什么?

【问题讨论】:

  • 请查看this。出去。将帮助您理解这个概念。

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


【解决方案1】:

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

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

【讨论】:

  • 您对如何将 firebase 数据读入列表并能够使用结果有什么建议吗?我认为值事件监听器是从 firebase 读取数据的唯一方法
  • 仅使用来自回调本身或它调用的函数的查询结果。不要只是将结果填充到某个成员或全局变量中,并期望其他代码能够使用它。
  • 回调中的意思是什么?值事件监听的回调在哪里?
  • 回调是你的new ValueEventListener
  • 好吧,但不是触发基础任务应该处理异步计算,以便在另一个线程上完成后获得它的结果吗?
猜你喜欢
  • 2018-07-09
  • 1970-01-01
  • 2021-04-24
  • 1970-01-01
  • 2017-06-23
  • 1970-01-01
  • 2011-02-14
  • 1970-01-01
相关资源
最近更新 更多