Я уже понял это спасибо. Но почему, когда я помещаю в него код, он работает, а когда я вызываю метод, он не работает?

я много вопросов об асинхронной базе данных в моем приложении для 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, как я ожидаю с помощью своего трюка.

Можешь мне помочь ? Я решаю проблему неправильно? Как я должен сделать, чтобы только выполнить мою вторую функцию, при условии, что мой массив был изменен? Как я могу сохранить свой код в ожидании изменений в моей базе данных, прежде чем выполнять что-то еще?
Надеюсь, вы поняли меня и можете задать мне вопрос, если вы не поняли что-то в моей проблеме.

Ответы на вопрос(1)

Ваш ответ на вопрос