java - 从返回 NULL 的 firebase 检索数据

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

最佳答案

虽然您当然可以使用信号量之类的东西将 listPost() 转换为同步方法,但这并不是 Firebase 旨在工作的方式。例如,每次您调用 addValueEventListener() 时,它都会添加一个新的监听器,只要您的数据发生变化,它就会被调用,每次您调用 listPost() 时都会调用一次。

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

// 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,并对添加的子项、更改的子项和删除的子项事件使用react,以更新您的状态或 UI。

关于java - 从返回 NULL 的 firebase 检索数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27499645/

相关文章:

来自服务的 Android 通知未打开 Activity

javascript - Google Firebase 我想控制台记录我的 firebase 数据

ios - Mapview委托(delegate)函数在关闭包含mapview的 View Controller 后继续运行

android - 当屏幕处于休眠状态时,保持 Activity 在屏幕锁定状态下运行

firebase - 如何将 Firebase 再次连接到移动用户界面?

Java - 添加输入按钮

java - BufferedReader 无限循环 - Java

java - App Engine (Java) Blobstore : no BlobInfo after successfully storing blob

java - ADF 皮肤样式加载错误的类

android - 调整调整大小和 ScrollView 不适用于编辑文本