Как передать данные с сервера / менеджера для просмотра модели RxJava Android - PullRequest
0 голосов
/ 25 сентября 2018

Я очень новичок в RxJava и работаю над ним с приложением для Android.Я делаю сетевой запрос, и я хотел бы, чтобы мой фрагмент обновил пользовательский интерфейс на основе данных, полученных по сети, и я ищу хороший способ «rx» сделать это.По сути, мой Фрагмент немедленно запускает мою viewmodel, чтобы он сделал серверный вызов.Мне нужно сделать вызов сервера и уведомить / отправить эти данные в viewModel, чтобы я мог обновить их до фрагмента.Обычно (без rx) я просто передаю все эти данные с переменными, но как мне добиться этого потока данных с использованием rx и наблюдаемых?

Спасибо всем.

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Собираюсь показать простой пример с кодом.Еще один способ сделать это, используя концепцию единого источника истины (SSOT).

Activity -> ViewModel ---> Repository ---> Вставить в комнату DB

  1. Шаг 01: Получить все данные из базы данных комнаты с запросом Live Data.И установите адаптер.
  2. Шаг 02: вызов из Activity / Fragment в удаленную базу данных / репозиторий для получения данных.
  3. Шаг 03: После получения данных из удаленного репозитория вставьте их в базу данных помещения.
  4. Шаг 04: Вы уже наблюдаете данные с помощью Live Query на шаге 01, поэтому, как только вы вставите данные в базу данных комнаты, ваш запрос наблюдения в реальном времени снова сработает и обновит ваш просмотр списка.

Теперь следующий пример не завершен.Но чтобы получить грубую идею.Для вызова и обновления списка с помощью 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() {

                }
            });



}
0 голосов
/ 25 сентября 2018

Создайте отдельный слой Repository, получайте к нему доступ только из ваших viewModels.

Таким образом, у вас будут запросы запуска привязки представления / базы данных.

Далее, нужно иметь некоторое управление состояниями внутри Repository или store.некоторые данные там (используйте LiveData)

В вашей ViewModel назначьте значение для ссылки LiveData из репозитория.Поэтому каждый раз, когда вы обновляете его внутри репозитория, viewModel будет иметь один и тот же объект.

Наконец, вы можете наблюдать LiveData этого viewModel. enter image description here

val someData = MutableLiveData<SomeObject>() - этот внутри репозитория, теперь вы сможете сохранить любой результат сетевого вызовавнутри репозитория.

Ваш ViewModel должен содержать следующее: val someData= Repository.instance.someData

А из фрагмента / вида использования: viewModel.someData.observe(this, {...})

...