Я уже понял это спасибо. Но почему, когда я помещаю в него код, он работает, а когда я вызываю метод, он не работает?
я много вопросов об асинхронной базе данных в моем приложении для Android.
Поскольку я знаю, что база данных асинхронная, я попробовал несколько вещей, чтобы справиться с ней. Как вы можете видеть из моего кода, у меня есть две функции, которым нужно использовать массив в моей базе данных. Моя первая функция (setArrayfromDatabase
) применит изменения к моему массиву в моей базе данных и моей второй функции (setAnotherArray
) нужно использовать этот массив с изменениями, примененными в моей первой функции. Вот мой код:
FirebaseDatabase database = FirebaseDatabase.getInstance();
final DatabaseReference myReff =database.getReference("server").child("user");
myReff.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
//Take the array from my database
final ArrayList<Integer> array_from_database;
GenericTypeIndicator<ArrayList<Integer>> genericTypeIndicator = new GenericTypeIndicator<ArrayList<Integer>>() {};
array_from_database = dataSnapshot.getValue(genericTypeIndicator) ;
System.out.println("1");
//use this array in this first function, and this function will modify it.
setArray_for_database(array_from_database);
myReff.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
//this will be executed only if my array is changed (So only if my other function have been correctly executed
setAnotherArray(array_from_database);
System.out.println("3");
}
@Override
public void onCancelled(DatabaseError databaseError) {}
});
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
Вот код для setArray_for_database:
public void setArray_for_database(ArrayList<Integer> array_from_database){
FirebaseDatabase database = FirebaseDatabase.getInstance();
final DatabaseReference myReff =database.getReference();
//Take the array from my database (gived in parameter)
final ArrayList<Integer> array = array_from_database;
myReff.addListenerForSingleValueEvent(new ValueEventListener(,) {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
//this will be executed, even if data hasn't been changed because of the method (addListenerForSingleValueEvent)
System.out.println("2");
array.set(0,3);
Map<String, Object> chemainChild = new HashMap<>();
chemainChild.put("server/user/",array);
myReff.updateChildren(chemainChild);
}
@Override
public void onCancelled(DatabaseError databaseError) {}
});
}
Вот мой трюк. Цель иметьmyReff.addValueEventListener(new ValueEventListener()
внутри другогоmyReff.addListenerForSingleValueEvent(new ValueEventListener()
это только выполнить onDataChange, если мой массив из базы данных был изменен. Но проблема в том, что это не так. Вот что печатается первым: 1, 3, 2 вместо 1, 2, 3, как я ожидаю с помощью своего трюка.
Можешь мне помочь ? Я решаю проблему неправильно? Как я должен сделать, чтобы только выполнить мою вторую функцию, при условии, что мой массив был изменен? Как я могу сохранить свой код в ожидании изменений в моей базе данных, прежде чем выполнять что-то еще?
Надеюсь, вы поняли меня и можете задать мне вопрос, если вы не поняли что-то в моей проблеме.