我对RxJava非常陌生,正在使用它开发一个Android应用程序。我正在发出网络请求,我希望我的Fragment根据网络返回的数据更新UI,并且我正在寻找一种实现此目的的好“ rx”方法。基本上,我让我的Fragment立即触发我的viewmodel,它应该进行服务器调用。我需要进行服务器调用,并将该数据通知/发送到viewModel,以便可以将其更新为片段。通常(没有rx),我只是将所有这些数据都传递给变量,但是如何使用rx和observables实现此数据流?
谢谢大家。
答案 0 :(得分:2)
创建一个单独的存储库层,仅从您的viewModels中访问它。
通过这种方式,您将拥有视图/数据绑定触发请求。
接下来,在存储库中进行一些状态管理或在其中存储一些数据(使用LiveData)
在ViewModel中,将值分配给来自存储库的LiveData的引用。因此,无论何时在存储库中更新它,viewModel都会具有相同的对象。
val someData = MutableLiveData<SomeObject>()
-这是一个内部存储库,现在您可以将任何网络呼叫结果保存在存储库中。
让ViewModel包含下一个:val someData= Repository.instance.someData
从片段/活动中使用:viewModel.someData.observe(this, {...})
答案 1 :(得分:0)
将显示带有代码的简单示例。使用概念单一真理源(SSOT)进行此操作的另一种方法。
活动-> ViewModel --->存储库--->在Room DB上插入
现在以下示例尚未完成。但是有个大概的想法。 使用LiveData调用和更新列表。
Activity/ Fragment:
RouteViewModel mViewModel = ViewModelProviders.of(this).get(RouteViewModel.class);
mViewModel.getAllRoutes().observe(this, new Observer<List<Route>>() {
@Override
public void onChanged(@Nullable final List<Route> items) {
// will call automatic as soon as room database update
adapter.setItems(items);
}
});
//init/write a remote call here (like you called on room database)
--View Model
public LiveData<List<Route>> getAllRoutes()
{
//call here reposatory
return mAllRoutes;
}
//also write another method here to call repo to init a remote call
---Repository
public LiveData<List<Route>> getRoutes() {
//call on Dao
return mRouteDao.getRoutes();
}
//init a remote call
public Observable<Route> getRoutesFromNetwork(int routeID) {
return new NetworkService().GetChannel().subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<String>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(String result) {
List<Route> items = new Gson().fromJson(result, new TypeToken<List<Route>>() {
}.getType());
Completable.fromRunnable(() -> {
//insert routes
//if routes is Live data it will update ui automatic
}).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new CompletableObserver() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onComplete() {
Log.v("Completed", "DONE");
Toasty.info(context,"DONE", Toast.LENGTH_SHORT,true).show();
}
@Override
public void onError(Throwable e) {
Log.v("Error", "Error");
}
});
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
}