Как дождаться завершения асинхронного вызова RxJava, прежде чем переходить к остальной части кода? - PullRequest
0 голосов
/ 22 ноября 2018

Я использую 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...