java - 使用 void 函数更新数组,但该数组为空

标签 java android firebase-realtime-database

所以我创建了一个 void 函数,该函数应该将一些值放入数组中。我调用该函数,然后调用数组变量,它崩溃并说它为空。我还使用 firebase 来获取所有值。

这是函数:

    private void findRestaurantKey()
{
    mDatabase = FirebaseDatabase.getInstance();
    mDatabaseReference = mDatabase.getReference("x");
    mDatabaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            if (dataSnapshot.exists()) {
                int i = 0;
                for (DataSnapshot d : dataSnapshot.getChildren()) {
                    allRestNames[i] = d.getKey();
                    i++;
                }
            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });
}

这是我尝试调用它的方式:

   protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.food_activity);
    this.findRestaurantKey();
    Log.d("ARRAY" , allRestNames.toString());
  }

最佳答案

您需要初始化数组。

List<String> allRestNames = new ArrayList();

但是,如果您按原样运行代码,则不会记录任何内容

这就是所谓的“竞争条件”,您正在运行异步代码,期望结果在您调用它后立即出现。

当像使用 Firebase 服务那样向 API 发出请求时,需要时间。

所以,如果你想记录结果,你应该做的是在回调中执行:

protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.food_activity);
    findRestaurantKey();
}


private void findRestaurantKey() {
    mDatabase = FirebaseDatabase.getInstance();
    mDatabaseReference = mDatabase.getReference("x");
    mDatabaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            if (dataSnapshot.exists()) {
                for (DataSnapshot d : dataSnapshot.getChildren()) {
                    allRestNames.add(d.getKey());
                }

                // HERE is when the data is available from the Firebase service
                Log.d("ARRAY" , allRestNames.toString());
            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });
}

关于java - 使用 void 函数更新数组,但该数组为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58633255/

相关文章:

java - 无模式 OrientDb 中的关系

Java:一个 UUID 生成单例

java - mod_pagespeed 和 java 应用程序服务器

android - Android 上的 map v2 API key

swift - 在使用 queryEqualToValue 查询获取用户信息时,我无法获取具有额外子 [Firebase][Swift] 的用户信息

java - 使用 if 条件循环与三元运算符循环哪个更快?

构建apk后找不到Java静态接口(interface)方法

更新后Android资源编译失败

java - 如何将数据库引用(来自回调)传递给 FirebaseRecyclerAdapter

android - 检测到 firebase 子值为 "null"或 "0"