从firebase检索数据返回NULL

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

public Post[] listPost() { ArrayList list = new ArrayList(); // 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()它都会添加一个新的侦听器,每次调用数据时都会调用该侦听器,每次调用addValueEventListener()时都会调用一次。

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

 // Setup once when your app loads postRef.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot snapshot) { ArrayList list = new ArrayList(); 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。