Index:0 Size:0 从 firebase 获取项目时

Index:0 Size:0 when fetching item from firebase

我正在尝试像这样从 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);

可能在 addOnCompleteListener.

中的代码之前被调用

如果您想让 getVCount 有办法获得 return 结果,一种方法是创建您自己的回调,如下所示:

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);
    }
});