java – 等待检索Firestore数据以启动活动
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 等待检索Firestore数据以启动活动,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3582字,纯文字阅读大概需要6分钟。
内容图文
我已经制作了一个POJO对象列表,它从我的Cloud Firestore数据库中获取值.此List本身就是一个类,每次创建新List时都要检索属性.问题是列表没有填写在创建活动上,而是在时间之后.我已经尝试添加循环,任务,等待,但没有得到所需的结果.以下是我如何令人满意地检索我的数据:
private void retrieveData(){
reference = firestore.collection("attractions");
reference.addSnapshotListener(new EventListener<QuerySnapshot>() {
@Override
public void onEvent(@Nullable QuerySnapshot queryDocumentSnapshots,
@Nullable FirebaseFirestoreException e) {
attractionList.clear();
for (DocumentSnapshot snapshot : queryDocumentSnapshots) {
Attraction attraction = snapshot.toObject(Attraction.class);
addAttractions(attraction);
}
}
});
}
每次创建新对象时都会检索数据:
public AttractionList() {
firestore.setFirestoreSettings(settings);
reference = firestore.collection("attractions");
attractionList = new ArrayList<>();
retrieveData();
}
然后,如果我在创建的活动上检查列表大小:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_attraction);
Toolbar toolbar = findViewById(R.id.tb_attraction);
setSupportActionBar(toolbar);
//Creating POJO List and retrieving data
attractionList = new AttractionList();
Log.e("List Size: ", ""+attractionList.getAttractionList().size());
//List Size: 0
}
但如果我在任何按钮后使用相同的日志时间:
@Override
public void onBackPressed(){
Log.e("List Size: ", ""+attractionList.getAttractionList().size());
//List Size: 16
}
我真的不想在每个Activity中检索数据或创建意图以在活动之间引入Object.有什么办法可以解决这个问题吗?
PS:这是我的第一篇文章.对不起,如果我没有以正确的方式做到这一点.非常感谢.
解决方法:
您现在无法使用尚未加载的内容. Firestore异步加载数据,因为这可能需要一些时间.根据您的连接速度和状态,可能需要几百毫秒到几秒才能获得数据.如果要将类型为Attraction的对象列表传递给另一个方法,只需在onSuccess()方法中调用该方法并将该列表作为参数传递.所以快速解决这个问题:
FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
CollectionReference attractionsRef = rootRef.collection("attractions");
attractionsRef.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
List<Attraction> attractionsList = new ArrayList<>();
for (QueryDocumentSnapshot document : task.getResult()) {
Attraction attraction = document.toObject(Attraction.class);
attractionsList.add(attraction);
}
methodToProcessTheList(attractionsList);
}
}
});
所以请记住,onSuccess()方法具有异步行为,这意味着甚至在从数据库获取数据之前就会调用它.如果要在该方法之外使用attractionsList,则需要创建自己的回调.要实现这一点,首先需要创建一个这样的接口:
public interface MyCallback {
void onCallback(List<Attraction> attractionsList);
}
然后,您需要创建一个实际从数据库获取数据的方法.此方法应如下所示:
public void readData(MyCallback myCallback) {
attractionsRef.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
List<Attraction> attractionsList = new ArrayList<>();
for (QueryDocumentSnapshot document : task.getResult()) {
Attraction attraction = snapshot.toObject(Attraction.class);
attractionsList.add(attraction);
}
myCallback.onCallback(attractionsList);
}
}
});
}
最后,只需调用readData()方法并将MyCallback接口的实例作为参数传递到您需要的地方,如下所示:
readData(new MyCallback() {
@Override
public void onCallback(List<Attraction> attractionsList) {
//Do what you need to do with your list
}
});
这是您可以在onSuccess()方法之外使用attractionsList对象的唯一方法.有关更多信息,您还可以查看此video.
内容总结
以上是互联网集市为您收集整理的java – 等待检索Firestore数据以启动活动全部内容,希望文章能够帮你解决java – 等待检索Firestore数据以启动活动所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。