从firebase检索数据返回NULL [英] Retrieving data from firebase returning NULL

查看:142
本文介绍了从firebase检索数据返回NULL的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

当我调用listPost()时,它将返回NULL。我想它不会等待侦听器从firebase获取帖子。如何在返回arrayPost之前等待从firebase获取帖子?

When I call listPost(), it will return NULL. I guess it doesn't wait for the listener to fetch the post from the firebase. How can I wait to fetch the post from firebase before arrayPost get returned?

public Post[] listPost() {
    ArrayList<Post> list = new ArrayList<Post>();

    // Fetch post from firebase
    postRef.addValueEventListener(new ValueEventListener() {

        @Override
        public void onDataChange(DataSnapshot snapshot) {
            for(DataSnapshot child : snapshot.getChildren()) {
                String id = child.getKey();
                String title = child.child("title").getValue().toString();
                String content = child.child("content").getValue().toString();
                String date = child.child("date").getValue().toString();
                String status = child.child("status").getValue().toString();

                Post post = new Post();
                post.setId(id);
                post.setTitle(title);
                post.setContent(content);
                post.setDate(date);
                post.setStatus(status);
                list.add(post);
            }
        }

        @Override
        public void onCancelled(FirebaseError error) {
            System.out.println("The read failed: " + error.getMessage());
        }
    });

    // Convert ArrayList to Array 
    Post[] arrayPost = new Post[list.size()]; 
    list.toArray(arrayPost);
    return arrayPost;
}


推荐答案

虽然你当然可以转 listPost()使用信号量这样的同步方法,这不是Firebase的工作方式。例如,每次调用 addValueEventListener()时,它都会添加一个新的侦听器,每次调用数据时都会调用该侦听器,每次调用时listPost()

While you can certainly turn listPost() into a synchronous method using something like semaphores, this is not the way Firebase is intended to work. For example, every time you call addValueEventListener() it will add a new listener which will be called whenever your data changes, once for every time you called listPost().

如果 listPost()方法的目的是在某处更新某些状态(例如您的UI),您可以直接从 onDataChanged()方法更新状态。这将确保您只添加一个值事件侦听器,并且数据中的更新将始终反映在您当前的状态而无需刷新。

If the purpose of the listPost() method is to update some state somewhere (e.g. your UI), you can instead update the state directly from your onDataChanged() method. This will ensure that you only add one value event listener and updates in your data will always be reflected in your current state without needing to refresh.

// Setup once when your app loads
postRef.addValueEventListener(new ValueEventListener() {

    @Override
    public void onDataChange(DataSnapshot snapshot) {
        ArrayList<Post> list = new ArrayList<Post>();
        for(DataSnapshot child : snapshot.getChildren()) {
            String id = child.getKey();
            String title = child.child("title").getValue().toString();
            String content = child.child("content").getValue().toString();
            String date = child.child("date").getValue().toString();
            String status = child.child("status").getValue().toString();

            Post post = new Post();
            post.setId(id);
            post.setTitle(title);
            post.setContent(content);
            post.setDate(date);
            post.setStatus(status);
            list.add(post);
        }
        // Do something with your list of posts here
        updateSomething(list);
    }

    @Override
    public void onCancelled(FirebaseError error) {
        System.out.println("The read failed: " + error.getMessage());
    }
});

由于这里有孩子列表,你也可以使用 ChildEventListener 此处改为对添加的子项,子项更改和子项删除事件做出反应以更新您的状态或UI。

Since you have a list of children here you can also use a ChildEventListener here instead and react to child added, child changed and child removed events to update your state or UI.

这篇关于从firebase检索数据返回NULL的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆