所以我做了一个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());
}
答案 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()
也不会得到任何有意义的数据。