При попытке отобразить сообщение Toast со значением вашей переменной keys
вне обратного вызова, вы всегда получите null
, поскольку onDataChange()
работает асинхронно.Поскольку этот метод возвращает немедленно, значение вашей переменной keys
, которую вы пытаетесь отобразить, еще не было заполнено из обратного вызова.Там нет никаких гарантий о том, сколько времени это займет.Таким образом, это может занять от нескольких сотен миллисекунд до нескольких секунд, прежде чем эти данные станут доступны.
Для быстрого решения этой проблемы можно было бы использовать переместить следующую строку кода:
Toast.makeText(this, keys, Toast.LENGTH_LONG).show();
Сразу после окончания цикла for, в противном случае я рекомендую вам увидеть последнюю часть моего ответа из этого поста , в котором я объяснил, как это можно сделать с помощью пользовательского обратного вызова.Вы также можете взглянуть на это видео для лучшего понимания.
Редактировать: Пожалуйста, смотрите ниже весь код:
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) {
}
});
}
}