当用户启动活动时,将弹出Toast,其中包含父节点,其中值“drinkManufacturerID”等于给定的String。但是,Toast中返回null值。
相关代码:
public class DealRawDataActivity extends AppCompatActivity {
DatabaseReference databaseDrinks;
String keys;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_deal_raw_data);
databaseDrinks = FirebaseDatabase.getInstance().getReference("drinks").child("-LWLuM2nesg0uaP0dLSn");
databaseDrinks.orderByChild("drinkManufacturerID").equalTo("D1eY5v9guwSIWMvfLoq8xGywrT53").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot datas : dataSnapshot.getChildren()) {
keys = datas.getKey();
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
Toast.makeText(this, keys, Toast.LENGTH_LONG).show();
}
}
当试图在回调之外显示包含keys
变量值的Toast消息时,由于null
具有异步行为,因此您将始终获得onDataChange()
。因为该方法立即返回,所以您尝试显示的keys
变量的值尚未从回调中填充。无法保证需要多长时间。因此,在数据可用之前可能需要几百毫秒到几秒钟。
快速解决这个问题就是使用移动以下代码行:
Toast.makeText(this, keys, Toast.LENGTH_LONG).show();
在for循环结束之后,我建议你从这个post中看到我的anwser的最后一部分,其中我已经解释了如何使用自定义回调来完成它。你也可以看看这个video以便更好地理解。
编辑:请参阅下面的整个代码:
public class DealRawDataActivity extends AppCompatActivity {
DatabaseReference databaseDrinks;
String keys;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_deal_raw_data);
databaseDrinks = FirebaseDatabase.getInstance().getReference("drinks").child("-LWLuM2nesg0uaP0dLSn");
databaseDrinks.orderByChild("drinkManufacturerID").equalTo("D1eY5v9guwSIWMvfLoq8xGywrT53").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot datas : dataSnapshot.getChildren()) {
keys = datas.getKey();
}
Toast.makeText(this, keys, Toast.LENGTH_LONG).show(); //Should work!!
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
}