当我调用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()
方法。这将确保您只添加一个值事件侦听器,并且数据中的更新将始终反映在您的当前状态中,而无需刷新。
// 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。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)