Операция чтения Firebase вернула пустой Android в Android - PullRequest
0 голосов
/ 28 мая 2019

Я пытаюсь реализовать базу данных 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, но когда он возвращается, void, однако в этой функции он входит в onDataChange, поэтому он должен считывать значения, но возвращает пустой массив другому классу. Некоторые идеи? Я позволю вам захватить мою структуру базы данных.

База данных

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

1 Ответ

0 голосов
/ 28 мая 2019

Поскольку 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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...