索引:0大小:从firebase获取项目时为0



我正试图从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);
}
});