从firebase检索数据返回NULL

时间:2014-12-16 07:31:24

标签: java android firebase

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

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

1 个答案:

答案 0 :(得分:3)

虽然您可以使用信号量之类的内容将listPost()转换为同步方法,但这并不是Firebase的工作方式。例如,每次调用addValueEventListener()时,它都会添加一个新的侦听器,每次调用数据时都会调用该侦听器,每次调用listPost()时都会调用一次。

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

// 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。