Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/225.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 加载数据反应/非反应、LiveData、RxJava_Android_Rx Java2_Android Architecture Components_Android Livedata - Fatal编程技术网

Android 加载数据反应/非反应、LiveData、RxJava

Android 加载数据反应/非反应、LiveData、RxJava,android,rx-java2,android-architecture-components,android-livedata,Android,Rx Java2,Android Architecture Components,Android Livedata,首先,我要说我读了一百万个博客,看了一千多个视频,我对这个页面越来越困惑。。喋喋不休地输入这些信息有助于我解决一些问题 TL;博士 主要问题是,对于UI层,如何反应式地(使用后台线程)检索数据,对于已经在后台线程上调用了您的方法的业务层方法,如何正常地(在方法中内联)检索数据。您的回购和Dao是否需要多个方法来执行相同的查询 @Query("Select * from Product WHERE Product.ProductId = :id") ProductDb getForId(Integ

首先,我要说我读了一百万个博客,看了一千多个视频,我对这个页面越来越困惑。。喋喋不休地输入这些信息有助于我解决一些问题

TL;博士 主要问题是,对于UI层,如何反应式地(使用后台线程)检索数据,对于已经在后台线程上调用了您的方法的业务层方法,如何正常地(在方法中内联)检索数据。您的回购和Dao是否需要多个方法来执行相同的查询

@Query("Select * from Product WHERE Product.ProductId = :id")
ProductDb getForId(Integer id);

@Query("Select * from Product WHERE Product.ProductId = :id")
LiveData<ProductDb> getForIdLive(Integer id);

@Query("Select * from Product WHERE Product.ProductId = :id")
Maybe<ProductDb> getForIdRx(Integer id);
ViewModel有一个方法

public LiveData<Product> getProductById(int id) {
    return mReferenceDataRepository.loadProductById(id);
}
但该方法返回的是LiveData,而不仅仅是POJO产品 我现在是否需要存储库中的其他方法

我也从同样的角度研究了RxJava。
您可以从Dao返回一个Maybe,事实上,Rx更容易管理异常。但它也有同样的问题——在存储库和Dao中是否需要单独的方法


事实上,使用存储库的原因是您可以切换出实现。如果您的方法公开了LiveData,或者您真的可以轻松地切换实现吗?

您好,我想问一下您是否找到了解决此问题的令人满意的解决方案?我认为这是结构良好的应用程序中非常常见的问题。我想到的不同解决方案是注册一个观察者,然后在收到第一个值后取消注册,但这似乎是非常糟糕的解决方法。
mMyViewModel.getProductById(productId).observe(this,productObserver);
public LiveData<Product> getProductById(int id) {
    return mReferenceDataRepository.loadProductById(id);
}
public LiveData<Product> loadProductById(int id) {
    return mProductDao.loadProductById(id);
}
@Query("SELECT * from Product WHERE ProductId = :id")
LiveData<Product> loadProductById(int id);
Product p = mReferenceDataRepository.loadProductById(productId);
Location l = mReferenceDataRepository.loadLocationById(locationId);

if (p.getQuarantine())....

if (l.getIsQuarantine())....