Как избежать загрузки тех же данных из базы данных Firebase в реальном времени? - PullRequest
0 голосов
/ 17 мая 2019

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

То, что я сделал до сих пор, это использование ViewModelи LiveData и они работают нормально.Более того, если я отключаю телефон от Интернета, данные показываются (и, конечно, не загружаются), даже если я перемещаюсь между фрагментами.

Во фрагменте, который показывает данные, которые у меня есть:

LiveData<List<UncompletedTask>> taskLiveData = viewModel.getTaskLiveData();
taskLiveData.observe(this, new Observer<List<UncompletedTask>>() {
    @Override
    public void onChanged(List<UncompletedTask> uncompletedTasks) {
        myAdapter.submitList(uncompletedTasks);
        listener.onTodoListElementsLoaded(uncompletedTasks.size());
    }
});

В модели представления у меня есть:

private TodoTaskRepository repository;
@NonNull
public LiveData<List<UncompletedTask>> getTaskLiveData() {
    return repository.getTaskLiveData();
}

В TodoTaskRepository я инициализирую FirebaseQueryLiveData в конструкторе и возвращаю его в getTaskLiveData().Наконец, FirebaseQueryLiveData выглядит следующим образом:

public class FirebaseQueryLiveData extends LiveData<DataSnapshot> {
    private static final String LOG_TAG = "FirebaseQueryLiveData";

    private final Query query;
    private final MyValueEventListener listener = new MyValueEventListener();

    public FirebaseQueryLiveData(Query query) {
        this.query = query;
    }

    @Override
    protected void onActive() {
        query.addValueEventListener(listener);
    }

    @Override
    protected void onInactive() {
        query.removeEventListener(listener);
    }

    private class MyValueEventListener implements ValueEventListener {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            setValue(dataSnapshot);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            Log.e(LOG_TAG, "Can't listen to query " + query, databaseError.toException());
        }
    }
}

Как я могу загрузить все данные в первый раз, а затем просто слушать изменения и не загружать одни и те же данные при навигации между фрагментами, если ничего не изменилось?

1 Ответ

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

Если вы включили постоянство диска , то данные не будут загружаться снова, если только данные не изменились

FirebaseDatabase.getInstance (). SetPersistenceEnabled (true);

При запуске ValueEventListener при первой загрузке данных в порядке, во второй раз при выполнении тех же самых операций ValueEventListener данные поступают из локального постоянного кэша

Более того, если отключить телефон отИнтернет данные действительно поступают из того же локального кэша.

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