Поскольку 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();