Операция чтения Firebase вернула пустой массив в Android

Я пытаюсь внедрить базу данных Firebase в свое приложение для Android, но когда она возвращает массив, который должен быть заполнен именами строк, он недействителен. Это функция, которую я использую для возврата имен:

public class FirebaseOperation {

private static final String TAG1 = "Operacion de lectura";
FirebaseDatabase database = FirebaseDatabase.getInstance();
private final Callback callback;

public FirebaseOperation(Callback callback){
    this.callback = callback;
}

interface Callback{
    void dataIsLoaded(ArrayList<String> names);
}


public void  getUserNames(){
    final ArrayList<String> names = new ArrayList<>();

    DatabaseReference ref = database.getReference().child("idUsers");

    ref.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for (DataSnapshot ds : dataSnapshot.getChildren()){
                String name = ds.getValue(String.class);
                names.add(name);
                Log.d(TAG1, "LEcturea correcta");
            }
            callback.dataIsLoaded(names);
        }
        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            Log.w(TAG1, "Error al leer los nombres de usuario");
        }
    });

}

}

И вот где я назвал это:

idusers = new ArrayList<>();
new FirebaseOperation(new FirebaseOperation.Callback() {
    @Override
    public void dataIsLoaded(ArrayList<String> names) {
          idusers = names;
}
}).getUsernames();
if (idusers.isEmpty()){
                Log.w(TAG, "Array VACIOOOOO");
            }

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

База данных

Некоторые идеи??

Проверьте это.

Alex Mamo 28.05.2019 12:07
0
1
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поскольку new ValueEventListener() является асинхронным обратным вызовом, это означает, что return nombres происходит до того, как ответит Firebase RTD.

Если вы хотите сохранить свой класс FirebaseOperation, вам придется использовать другой обратный вызов для передачи Firebase после его получения:

public class FirebaseOperation {

    private final Callback callback;

    //Initializing the callback on the constructor for simplicity
    public FirebaseOperaion(Callback callback) {
        this.callback = callback;
    }

    //It doesn't return
    public void getUserNames(){
    final ArrayList<String> names = new ArrayList<>();

    DatabaseReference ref = database.getReference().child("idUsers");

    ref.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for (DataSnapshot ds : dataSnapshot.getChildren()){
                String name = ds.getValue(String.class);
                names.add(name);
                Log.d(TAG1, "LEcturea correcta");
            }
            callback.rtdResponse(names);
        }
        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            Log.w(TAG1, "Error al leer los nombres de usuario");
        }
        });
    }


    interface Callback {
        void rtdResponse(List<String> names);
    }

}

А теперь в другом классе, где вы его используете, вместо

List<String> names = new FirebaseOperation().getUserNames();

Вам нужно будет использовать обратный вызов:

//Use this if you want the other class implements the callback
new FirebaseOperation(this).getUserNames();
//Or use an anonymous implementation
new FirebaseOperation(new Callback {
    @Override
    void rtdResponse(List<String> names) {
        //Do something with your list here
    }
}).getUserNames();

Я пробовал по-вашему и все еще пусто, я отредактирую свой вопрос с вашим кодом, но теперь я знаю, что это асинхронно, все равно спасибо!

user11406817 28.05.2019 00:50

Другие вопросы по теме