在尝试从Firestore检索数据时,发现返回值始终以0
的形式出现。有人可以建议如何纠正吗?
public List<Passion> getPassionvalue() {
List<Passion> msglist = new ArrayList<>();
CollectionReference col_ref = this.get_collection_firestore("Passion")
col_ref
.get()
.addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if(task.isSuccessful())
{
for(QueryDocumentSnapshot document : task.getResult())
{
Passion passion =document.toObject(Passion.class);
msglist.add(passion);
}
}
else {
}
}
});
return msglist; // return value is always 0 as if no data.
}
编辑
存储库类中的方法:
public List<Passion> downloadpassion()
{
return fsDB.getPassionvalue();
}
ViewModel类中的方法:
public List<Passion> downloadpassionlist()
{
return mPassionRepository.downloadpassion();
}
答案 0 :(得分:1)
Android中的Internet请求必须异步,以避免冻结UI。由于Firebase是一项基于Internet的服务,因此具有相同的限制/要求。
在Java中使用侦听器时,程序不会等到该侦听器被调用才继续通过它,因为这样做会破坏异步的目的。
因此,您不能使用直接返回值的简单getter方法。相反,您需要使用自己的侦听器。
创建一个新界面(在您正在编辑的文件内部或作为其自己的类):
public interface OnPassionsFilledListener {
void onPassionsFilled(ArrayList<Passion> passions);
void onError(Exception taskException);
}
然后,稍微修改一下方法:
public void getPassionValue(OnPassionsFilledListener listener) {
get_collection_firestore("Passion")
.get()
.addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
ArrayList<Passion> passions = new ArrayList<>();
for (QueryDocumentSnapshot document : task.getResult()) {
Passion passion = document.toObject(Passion.class);
passions.add(passion);
}
listener.onPassionsFilled(passions);
} else {
listener.onError(task.getException());
}
}
});
}
要调用您的方法:
getPassionValue(new OnPassionsFilledListener() {
@Override
public void onPassionsFilled(ArrayList<Passion> passions) {
//handle the list
}
@Override
public void onError(Exception taskException) {
//handle the error
}
});
顺便说一句,在Java中,方法和变量名使用camelCase
(不是underscore_case
),而类则使用TitleCase
。您不必遵循这些准则,但是它们使其他人更容易阅读您的代码。