Я использую Architecture Components
.Это приложение показывает кучу продуктов для пользователей.В репозитории у меня есть функция fetchProducts()
, которая должна получать продукты, которых еще нет в базе данных.Чтобы сделать это, мне сначала нужно запросить базу данных, чтобы найти самый последний продукт (у них есть дата), чтобы я не выбирал продукты, которые уже есть в базе данных.Сейчас это, очевидно, очень важно, так как я не хочу делать больше работы, чем нужно.Как мне дождаться завершения асинхронного вызова?Вот что я попробовал:
LiveData<Boolean> fetchProducts() {
MutableLiveData<Boolean> booleanLoadingComplete = new MutableLiveData<>();
final CountDownLatch countDownLatch = new CountDownLatch(1);
final ProductWrapper productWrapper = new ProductWrapper();
productDao.getMostRecentProduct()
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<ProductEntity>() {
@Override
public void accept(ProductEntity productEntity) throws Exception {
productWrapper.product = productEntity;
countDownLatch.countDown();
}
});
try {
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
// now we should be able to safely proceed with the rest of the code
// more code goes here...
return booleanLoadingComplete;
}
Использование CountDownLatch
показалось хорошей идеей, но когда я попробовал это, приложение просто замерло, показывая пустой экран.
Это Dao
.Я начинающий с RxJava
и не знаю, подходит ли Flowable
для этого случая.
@Dao
public interface ProductDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
void insert(ProductEntity product);
@Query("SELECT * FROM product ORDER BY published_at DESC")
LiveData<List<ProductEntity>> getProducts();
@Query("SELECT * FROM product ORDER BY published_at DESC LIMIT 1")
Flowable<ProductEntity> getMostRecentProduct();
}