Пример MVVM Google Android - почему они используют MediatorLiveData вместо передачи LiveData с помощью геттера?

Я анализировал образец приложения для компонентов архитектуры Android (BasicSample). Почему они используют MediatorLiveData в DataRepository классе, если к нему прикреплен только один источник?

https://github.com/googlesamples/android-architecture-components/blob/master/BasicSample/app/src/main/java/com/example/android/persistence/DataRepository.java#L25-L31

mObservableProducts = new MediatorLiveData<>();

mObservableProducts.addSource(mDatabase.productDao().loadAllProducts(),
        productEntities -> {
            if (mDatabase.getDatabaseCreated().getValue() != null) {
                mObservableProducts.postValue(productEntities);
            }
        });

Я думаю, им следует просто использовать LiveData<List<ProductEntity>, поступающие из DAO, и упростить это с помощью метода получения:

public LiveData<List<ProductEntity>> getProducts() {
    return mDatabase.productDao().loadAllProducts();
}

Точно так же, как они поступили с другими запросами DAO:

https://github.com/googlesamples/android-architecture-components/blob/master/BasicSample/app/src/main/java/com/example/android/persistence/DataRepository.java#L47-L61

public LiveData<List<ProductEntity>> getProducts() {
    return mObservableProducts;
}

public LiveData<ProductEntity> loadProduct(final int productId) {
    return mDatabase.productDao().loadProduct(productId);
}

public LiveData<List<CommentEntity>> loadComments(final int productId) {
    return mDatabase.commentDao().loadComments(productId);
}

public LiveData<List<ProductEntity>> searchProducts(String query) {
    return mDatabase.productDao().searchAllProducts(query);
}

Тот же вопрос касается ProductListViewModel. Они снова создали MediatorLiveData только с одним источником.

https://github.com/googlesamples/android-architecture-components/blob/master/BasicSample/app/src/main/java/com/example/android/persistence/viewmodel/ProductListViewModel.java#L42-L46

mRepository = ((BasicApp) application).getRepository();
LiveData<List<ProductEntity>> products = mRepository.getProducts();

// observe the changes of the products from the database and forward them
mObservableProducts.addSource(products, mObservableProducts::setValue);

person AppiDevo    schedule 04.01.2019    source источник
comment
Вам не хватает того, что они намеренно фильтруют выбросы DAO до того, как исходные данные будут вставлены в БД. Это то, что MediatorLiveData, о котором вы упомянули, делает.   -  person EpicPandaForce    schedule 05.01.2019
comment
Ааа ОК :) Итак, если я не вставляю никаких данных в базу данных при первом запуске, я могу быть уверен, что база данных была создана до первого запроса, поэтому я могу использовать стандартный public LiveData<List<ProductEntity>> getProducts() { return mDatabase.productDao().loadAllProducts(); } без создания Mediator?   -  person AppiDevo    schedule 05.01.2019
comment
Да, тогда вы можете использовать стандартный dao без посредника;) технически, если вы не выполняли танец посредника, вы могли бы просто сначала подготовить пустое представление, а затем данные загружались бы при вставке данных благодаря интеграции LiveData Room. Так что этот посредник даже не был бы строго необходим.   -  person EpicPandaForce    schedule 05.01.2019


Ответы (1)


Они намеренно фильтруют выбросы DAO до того, как исходные данные будут вставлены в БД. Это то, что вы упомянули MediatorLiveData.

Если вам не нужно ждать «загрузки начального набора данных», как это делают они, то вы можете просто отказаться от MediatorLiveData и использовать mDatabase.productDao().loadAllProducts(); напрямую.

person EpicPandaForce    schedule 17.01.2019