Данные загружаются из Firebase асинхронно.Вместо того, чтобы ждать, пока база данных станет доступной, ваш основной код продолжается.Затем, когда данные доступны, ваш onDataChange
вызывается с моментальным снимком этих данных.
По этой причине весь код, которому нужны данные, должен быть (вызван) внутри onDataChange
.Таким образом, очень простое решение для вашей проблемы может быть:
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference leaf1RRef = database.getReference("leaf1").child("r");
leaf1RRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Integer red = dataSnapshot.getValue(Integer.class);
leaf1R=red;
leaf1RRef.setValue(255);
Log.d("MyLeaf", "Put max value");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.d("MyLeaf", "Put old value");
leaf1RRef.setValue(leaf1R);
}
@Override
public void onCancelled(DatabaseError error) {
Log.w("MyLeaf", "Failed to read value.", error.toException());
}
});
Обратите внимание, что этот код все еще блокирует основной поток / поток пользовательского интерфейса в onDataChange
, к которому Android не относится.Таким образом, хотя это может работать при тестировании, Thread.sleep()
может привести к тому, что ОС убьет / оштрафует ваше приложение.См. Этот вопрос для альтернативного способа задержки второго setValue()
: Как приостановить / перевести нить или процесс в Android?