java – 在onChildAdded函数内没有更新ArrayList
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 在onChildAdded函数内没有更新ArrayList,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3178字,纯文字阅读大概需要5分钟。
内容图文
![java – 在onChildAdded函数内没有更新ArrayList](/upload/InfoBanner/zyjiaocheng/711/f20c32df2f1549eda47faa8c2a9d2232.jpg)
public class DataService {
private static DataService ourInstance = new DataService();
private DatabaseReference mDatabase;
public static DataService getInstance() {
return ourInstance;
}
public ArrayList<UserDatabase> getFriendList() {
mDatabase = FirebaseDatabase.getInstance().getReference().child("users");
final ArrayList<UserDatabase> list = new ArrayList<>();
mDatabase.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
UserDatabase userDatabase = dataSnapshot.getValue(UserDatabase.class);
list.add(userDatabase);
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {}
@Override
public void onCancelled(DatabaseError databaseError) {}
});
return list;
}
}
我试图从用户节点获取我的用户数据库.它的表现非常奇怪.当我在onChildAdded函数上设置断点时,它将检索所有用户并将其添加到列表中.
但是,如果我没有在那里设置断点,它没有得到任何东西,列表大小为0.有没有人知道发生了什么?提前致谢!
解决方法:
数据是从Firebase异步加载和同步的.
如果添加一些适当的日志记录语句,最简单的方法是查看导致问题的原因:
public ArrayList<UserDatabase> getFriendList() {
mDatabase = FirebaseDatabase.getInstance().getReference().child("users");
final ArrayList<UserDatabase> list = new ArrayList<>();
System.out.println("Attaching listener");
mDatabase.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
System.out.println("Got data");
}
public void onChildChanged(DataSnapshot dataSnapshot, String s) {}
public void onChildRemoved(DataSnapshot dataSnapshot) {}
public void onChildMoved(DataSnapshot dataSnapshot, String s) {}
public void onCancelled(DatabaseError databaseError) {}
});
System.out.println("Returning list");
return list;
}
输出将按以下顺序打印:
Attaching listener
Returning list
Got data
这可能不是你预期的顺序.但它确实解释了为什么如果你按原样运行代码的空列表.
原因是Firebase异步加载和同步数据.像大多数现代Web API一样,它不会等待结果返回(这将导致可怕的用户体验),而是让程序继续并在获取(新)数据时回调您的代码.
处理这种行为的方法是重构你的程序流程,从“首先获取朋友列表,然后用它做xyz”到“每当朋友列表改变时,用它做xyz”.
例如,假设您只想打印有多少朋友.您当前的方法可能是:
ArrayList<UserDatabase> friends = getFriendList();
System.out.println("There are "+friends.size()+" friends");
使用Firebase处理此问题的一种方法是将操作移动到getFriendList():
public void getFriendList() {
mDatabase = FirebaseDatabase.getInstance().getReference().child("users");
final ArrayList<UserDatabase> list = new ArrayList<>();
mDatabase.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
UserDatabase userDatabase = dataSnapshot.getValue(UserDatabase.class);
list.add(userDatabase);
System.out.println("There are "+friends.size()+" friends");
}
public void onChildChanged(DataSnapshot dataSnapshot, String s) {}
public void onChildRemoved(DataSnapshot dataSnapshot) {}
public void onChildMoved(DataSnapshot dataSnapshot, String s) {}
public void onCancelled(DatabaseError databaseError) {}
});
}
内容总结
以上是互联网集市为您收集整理的java – 在onChildAdded函数内没有更新ArrayList全部内容,希望文章能够帮你解决java – 在onChildAdded函数内没有更新ArrayList所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。