В соответствии с последним руководством архитектуры Google по шаблону MVVM, как передавать данные (уведомления) из калибровки репозитория в класс ModelView - PullRequest
0 голосов
/ 31 мая 2018

Я разработал пример проекта с последним руководством по архитектуре Google,

У меня есть фрагмент.

MainFragment.kt

  • который получает данные от MainViewModel LiveData и обновляет пользовательский интерфейс, который работает нормально

MainViewModel.kt

  • , который имеет MutableLiveData<User> пользователь, когда я обновляю пользователя, мой Наблюдатель в MainFragment вызывается, и я обновляю пользовательский интерфейс (работает нормально)

Теперь мой вопрос?

  • в моем MainActivity У меня загружено два фрагмента, MainFragment & SecondaryFragment.

    • У меня есть класс Repository.kt, который выполняет вызов APIи получить данные пользователя из SecondFragment.KT

Теперь, как мне сообщить из Repository.kt в MainViewModel, что у меня есть последние данные для обновления?

  • нужно ли мне использовать RXJava для передачи данных от Repository.KT до MainViewModel.KT, в таком случае как мне использовать его для передачи пользовательских данных?
  • Есть ли Android?Последний АрхитекторВы поддерживаете какого-либо наблюдателя для достижения этой цели?

1 Ответ

0 голосов
/ 31 мая 2018

Пойдем по частям:

Теперь, как мне сообщить из Repository.kt в MainViewModel, что у меня есть последние данные для обновления?

Вы можете использовать наблюдателяшаблон, так же, как тот, который вы используете от MainViewModel до пользовательского интерфейса.Если вы используете дооснащение, вы можете использовать адаптер вызовов для возврата наблюдаемых объектов RxJava (или синглов, потоков и т. Д.) Из вызовов дооснащения, поэтому, например, вы можете получить что-то вроде этого:

  @Headers({"Content-Type: application/json", "Accept: application/json"})
  @POST("/sign_in")
  Single<Response<LoginResponse>> traditionalLoginUser(
            @Body LoginRequest request,
            @Header("Authorization") String authToken);

ЭтоТипичный интерфейс Retrofit, который возвращает Single, затем вы можете наблюдать его в своем репозитории или просто передать его в ViewModel для наблюдения там.

Вы также можете добавить адаптер вызова для LiveData (есть один, реализованный с помощьюgoogle здесь ) и используйте LiveData вместо RxJava.Лично я не люблю использовать LiveData для сетевого уровня.

мне нужно использовать RXJava для передачи данных из Repository.KT в MainViewModel.KT, в таком случае как мнеиспользовать его для передачи пользовательских данных?

Вы можете использовать RxJava, да.Я на самом деле работал в образце приложения, которое делает именно это.Основная идея заключается в том, что вы используете хранилище для получения данных из вашего API и передачи Observable вместе с ViewModel.Что мне нравится делать во ViewModel, так это обрабатывать любые возможные ошибки, подписываясь на наблюдаемую (или другую сущность rx) и получая данные.Поскольку мы не можем обязательно обрабатывать ошибки в LiveData, как в случае с RxJava, мы можем обернуть LiveData для передачи ошибки в представление как состояние нашей оболочки (это на самом деле можно найти в этом google sample ).

Так, например, в моем хранилище у меня есть это:

fun getUsersNotPaged(page: Int, pageSize: Int): Single<SOResponse<User>> {
        return remoteDataSource.apiService.getTopUsers(page, pageSize)

    }

Тогда в моей модели View я делаю так:

var userList: MutableLiveData<LiveResource<SOResponse<User>>> = MutableLiveData()

 fun getUserListNotPaged(page: Int, pageSize: Int): MutableLiveData<LiveResource<SOResponse<User>>> {
        val result = usersRepository
                .getUsersNotPaged(page, pageSize)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe({ result ->
                    userList.postValue(LiveResource(LiveResourceStatus.SUCCESS, result, null))
                }, { error ->
                    userList.postValue(LiveResource(LiveResourceStatus.ERROR, null, error.localizedMessage))
                })


        return userList
    }

И, на мой взгляд:

 viewModel.getUserListNotPaged(1, 20).observe(this, Observer {
            it?.data?.let {
                Toast.makeText(this.context, "Here", Toast.LENGTH_SHORT).show()

            }
        })

Я использовал LiveResource, чтобы обернуть мой ответ RxJava и ошибки.

Вы также можете использовать расширение ReactiveStrems для преобразования Rx Publisher в LiveData, но вам нужно обрабатывать случаи, когда в ViewModel возникает ошибка, и гарантировать, что ошибки нетв результате LiveData.Примерно так:

fun getUserListNotPaged(page: Int, pageSize: Int): LiveData<SOResponse<User>> {
        val result = usersRepository
                .getUsersNotPaged(page, pageSize)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .onErrorReturn {
                   SOResponse<User>()
                }
                .toFlowable()

        return LiveDataReactiveStreams.fromPublisher(result)
    }

В этом случае, когда возникает ошибка, я просто возвращаю пустой ответ.

Поддерживает ли Android Latest Architecture какой-либо наблюдатель для достижения этой цели?

Да, как вы могли заметить, вы можете использовать LiveData повсеместно или только в середине процесса (только от виртуальной машины до пользовательского интерфейса).Некоторые люди не согласны использовать LiveData с HTTP-вызовами , хотя (я один из них, смеется).

...