Как наблюдать за ViewModel, который делает запрос на обратный звонок - PullRequest
0 голосов
/ 02 апреля 2019

Я пытаюсь сделать запрос в библиотеку, которая перезванивает мне.

Manager.getInstance().request(new CallBack())

Я хочу поместить это во ViewModel, чтобы я мог наблюдать это из Activity.

class RequestViewModel : ViewModel, CallBack {

    fun request() {
        Manager.getInstance().request(this)
    }

    override fun onFinished(result : List<String>?) {
    }

    override fun onFailed() {
    }
}

Как я могу сделать так, чтобы я мог наблюдать, когда это закончится? Я знаю, что мог бы Activity реализовать это CallBack, но я не хочу связывать Activity с этим.

В идеале это будет LiveData или Observable.

Ответы [ 2 ]

1 голос
/ 02 апреля 2019

Если я правильно понимаю вопрос, вы можете отправить данные, полученные методом onFinished, в экземпляр LiveData, который должен наблюдаться компонентом представления, например,

class RequestViewModel : ViewModel, CallBack {

    private val _liveData = MutableLiveData<SomeResult<List<String>>>
    val liveData: LiveData<SomeResult<List<String>>> get() = _liveData

    fun request() {
        Manager.getInstance().request(this)
    }

    override fun onFinished(result : List<String>?) {
        if (result != null) {
            _liveData.postValue(SomeResult.success(result))
        } else {
            _liveData.postValue(SomeResult.failure())
        }
    }

    override fun onFailed() {
        _liveData.postValue(SomeResult.failure())
    }
}

И где-нибудь в вашемобъект, который соответствует компоненту представления:

viewModel.liveData.observe(lifecycleOwner, Observer<List<String>> {
    handleResponse(it)
})

, тогда как lifecycleOwner обычно является вашим AppCompatActivity или android.support.v4.Fragment наследником.

0 голосов
/ 02 апреля 2019

Я бы посоветовал вам отделить запрос от ViewModel и создать класс с именем Repository для обработки всех запросов. В этом классе вы можете иметь объект MutableLiveData, который можно наблюдать, и всякий раз, когда извлекаются новые запрошенные данные, используйте mutableLiveData.postValue(retrievedData) для MutableLiveData, который уведомляет наблюдателей о новых изменениях.

Чтобы узнать больше о хранилище, вы можете перейти по следующим ссылкам:

Руководство Google по архитектуре приложений

Руководство по Codelab с шаблоном репозитория

...