我正试图从firebase中获取一个值,比如:
private String getVCount(String mPath) {
ArrayList<String> strings = new ArrayList<>();
FirebaseDatabase.getInstance().getReference("cars").child(mPath).child("maserati")
.get().addOnCompleteListener(new OnCompleteListener<DataSnapshot>() {
@Override
public void onComplete(@NonNull @NotNull Task<DataSnapshot> task) {
if(task.isSuccessful()){
strings.add(task.getResult().getValue().toString());
}else{
strings.add("0");
}
}
});
Log.d("mString", String.valueOf(strings.size()));
return strings.get(0);
}
我仔细检查了路径,甚至添加了一个else条件,使字符串数组列表中至少有一个值
数据库中的值确实存在,在某些情况下不存在-因此使用else语句添加默认值0。不过我不确定这样做是否正确。
此外,我仍然得到错误:索引:0大小:0——这意味着字符串数组列表是空的。
知道为什么会这样吗?
谢谢。
从Firebase实时数据库获取数据是一项异步任务。所以,
Log.d("mString", String.valueOf(strings.size()));
return strings.get(0);
可能在CCD_ 1内部的代码之前被调用。
如果你想让getVCount
有一种返回结果的方法,一种方法是创建自己的回调,如下所示:
public interface Callback {
void onCallback(String result);
}
private void getVCount(String mPath, Callback callback) {
ArrayList<String> strings = new ArrayList<>();
FirebaseDatabase.getInstance().getReference("cars").child(mPath).child("maserati")
.get().addOnCompleteListener(new OnCompleteListener<DataSnapshot>() {
@Override
public void onComplete(@NonNull @NotNull Task<DataSnapshot> task) {
if(task.isSuccessful()){
strings.add(task.getResult().getValue().toString());
}else{
strings.add("0");
}
Log.d("mString", String.valueOf(strings.size()));
callback.onCallback(strings.get(0));
}
});
}
这样称呼它:
getVCount(new Callback() {
@Override
public void onCallback(String result) {
Log.d(TAG, result);
}
});