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

时间:2019-10-30 20:33:54

标签: java android firebase-realtime-database

所以我做了一个void函数,该函数应该将一些值放在一个数组中。我先调用函数,然后再调用数组变量,然后崩溃说它为null。我还使用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());
  }

2 个答案:

答案 0 :(得分:2)

您需要初始化数组。

List<String> allRestNames = new ArrayList();

但是,如果您按原样运行代码,则不会Log任何事情

这就是所谓的“竞赛条件”,您正在运行异步代码,希望结果一出现就立即出现。

像使用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) {

        }
    });
}

答案 1 :(得分:1)

您需要在某处初始化数组:

allRestNames = new String[5000];

使用适当的数字代替5000。如果您不知道要从什么大小开始制作数组,则应使用ArrayList而不是数组。

此外,findRestaurantKey()为您的Firebase数据库创建一个侦听器。当此方法返回时,由于尚未调用侦听器,因此数据尚不可用。因此,即使您解决了当前错误,调用allRestNames.toString()中的onCreate()也不会得到任何有意义的数据。