如何将数据从服务器/管理器传递到视图模型RxJava Android

时间:2018-09-25 07:21:34

标签: android kotlin rx-java

我对RxJava非常陌生,正在使用它开发一个Android应用程序。我正在发出网络请求,我希望我的Fragment根据网络返回的数据更新UI,并且我正在寻找一种实现此目的的好“ rx”方法。基本上,我让我的Fragment立即触发我的viewmodel,它应该进行服务器调用。我需要进行服务器调用,并将该数据通知/发送到viewModel,以便可以将其更新为片段。通常(没有rx),我只是将所有这些数据都传递给变量,但是如何使用rx和observables实现此数据流?

谢谢大家。

2 个答案:

答案 0 :(得分:2)

创建一个单独的存储库层,仅从您的viewModels中访问它。

通过这种方式,您将拥有视图/数据绑定触发请求。

接下来,在存储库中进行一些状态管理或在其中存储一些数据(使用LiveData)

在ViewModel中,将值分配给来自存储库的LiveData的引用。因此,无论何时在存储库中更新它,viewModel都会具有相同的对象。

最后,您可以观察到viewModel的LiveData。enter image description here

val someData = MutableLiveData<SomeObject>()-这是一个内部存储库,现在您可以将任何网络呼叫结果保存在存储库中。

让ViewModel包含下一个:val someData= Repository.instance.someData

从片段/活动中使用:viewModel.someData.observe(this, {...})

答案 1 :(得分:0)

将显示带有代码的简单示例。使用概念单一真理源(SSOT)进行此操作的另一种方法。

活动-> ViewModel --->存储库--->在Room DB上插入

  1. 步骤01:使用实时数据查询从会议室数据库获取所有数据。并设置适配器。
  2. 第02步:从活动/片段调用到远程数据库/存储库以获取数据。
  3. 第03步:从远程存储库获取数据后,将其插入到会议室数据库中。
  4. 第04步:您已经在第01步使用Live Query观察了数据,因此      在房间数据库中插入数据,您的实时观察查询将再次触发并更新      您的列表视图。

现在以下示例尚未完成。但是有个大概的想法。 使用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() {

                }
            });



}