Android Firebase Получение данных синхронизировано и «возвращает» их - PullRequest
0 голосов
/ 26 февраля 2019

Прошу прощения, если это может показаться глупым вопросом, но я не нашел подобных вопросов, вот так.

У меня есть класс DatabaseService для извлечения данных (Animal) из FirebaseRealtime-Database.Из предыдущего поста я узнал, что, поскольку эти вызовы API являются асинхронными, необходимо создать интерфейс для синхронизации извлечения данных (метод onDataChange ())

Мои вопросы:

  1. Почему создание этого интерфейса и передача его в качестве параметра работает для синхронизации поиска данных?В моем коде, почему вызов метода интерфейсов onCallBack (который даже не определен позже) делает это возможным, какие шаги предпринимаются, чтобы это произошло?
  2. Создав этоКласс как служба базы данных (отсюда и название), я хочу, чтобы он возвращал список животных (List) для Activity, которая содержит эту службу, MyAnimalsActivity, для создания RecyclerView.Есть ли способ, которым я могу изменить «void» в этом методе интерфейса на «List», чтобы иметь что-то вроде

    List<Animal> listAnimals = databaseService.readData(); 
    

    , или мне лучше удалить весь этот класс DatabaseService и добавить свой код в сам MyAnimalsActivity, чтобы добавить Объекты Животных в глобальный список в методе onDataChange ()?

DatabaseService:

public class DatabaseService {

    private FirebaseDatabase firebaseDatabase;
    private DatabaseReference firebaseRootRef;
    private DatabaseReference animalsRef;
    List<Animal> animalsList;

    public DatabaseService() {

        this.firebaseDatabase = FirebaseDatabase.getInstance();
        this.firebaseRootRef = firebaseDatabase.getReference();
        this.animalsRef = firebaseDatabase.getReference("animals");

        animalsList = new ArrayList<>();
    }


    private interface FirebaseCallback {
        void onCallback(List<Animal> list);
    }

    public void readItemsFromDatabase(final FirebaseCallback firebaseCallback) {

        ValueEventListener valueEventListener = new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                animalsList.clear();

                //dataSnapshot.getChildren() ---> iterate through entire dataSnapshot Object, to get the items names
                for(DataSnapshot ds : dataSnapshot.getChildren()) {
                    Animal animal;
                    animal = ds.getValue(Animal.class);
                    animalsList.add(animal);
                }

                firebaseCallback.onCallback(animalsList);

            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                Log.d("DATABASE_TAG", databaseError.getMessage());
            }
        };

        animalsRef.addValueEventListener(valueEventListener);

    }


    public void readData() {
        readItemsFromDatabase(new FirebaseCallback() {
            @Override
            public void onCallback(List<Animal> list) {
                Log.d("DATABASE_TAG", list.toString());
            }
        });
    }

}

MyAnimalsActivity:

public class MyAnimalsActivity extends AppCompatActivity {

private RecyclerView recyclerView;
private RecyclerView.Adapter animalAdapter;

private List<Animal> listAnimals;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_my_animals);

    DatabaseService databaseService = new DatabaseService();
    databaseService.readData();


    recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
    recyclerView.setHasFixedSize(true); //every item of the recyclerview has a fixed size;
    recyclerView.setLayoutManager(new LinearLayoutManager(this));

    listAnimals = new ArrayList<>();
    //listAnimals  =  databaseService.readData();  ??


}
}

1 Ответ

0 голосов
/ 26 февраля 2019

Написание метода, который возвращает асинхронное значение, которого может не быть, может вызвать NullPointers, если вы вызовите его до того, как он получит данные.

Чтобы сделать это простым, поскольку метод readItemsFromDatabase является общедоступным, вы можете вызвать его с вашего MyAnimalsActivity и получить оттуда ваши данные.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_my_animals);

    DatabaseService databaseService = new DatabaseService();
    databaseService.readItemsFromDatabase(new DatabaseService.FirebaseCallback() {
            @Override
            public void onCallback(List<Animal> list) {
                Log.d("DATABASE_TAG", list.toString());

            }
        });
...

Я изолировал вашу проблемус моим проектом, и он работает;Кроме того, вы можете проверить шаблон MVP, который решит все эти проблемы для вас, и ваш код станет чище.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...