我正在使用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();
}