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

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

0
naesmanak 25 Сен 2018 в 10:21

2 ответа

Лучший ответ

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

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

Затем используйте управление состоянием внутри репозитория или сохраните там некоторые данные (используйте LiveData)

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

Наконец, вы можете увидеть LiveData этой модели viewModel. введите описание изображения здесь

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

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

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

3
Max Aves 25 Сен 2018 в 08:02

Покажу простой пример с кодом. Другой способ сделать это - использовать концепцию единого источника истины (SSOT).

Действие -> ViewModel ---> Репозиторий ---> Вставить в базу данных комнаты

  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() {

                }
            });



}
1
bluetoothfx 25 Сен 2018 в 08:33