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