MVVM не обновляет значения жизненных данных из асинхронного вызова дооснащения - PullRequest
0 голосов
/ 27 июня 2019

Я пытаюсь создать приложение с веб-сервисом + модернизация и асинхронный обратный вызов.

У меня есть запечатанный Kotlin

  sealed class StateDevol {
        object Loading: StateDevol()
        object Success: StateDevol()
        class showError(val error: String) : StateDevol()
    }

Вот мой репозиторий с модификацией, модернизацияработает нормально, и я получаю код 200.

Основная проблема заключается в следующем: я получаю изменение загрузки из liveata, но не остальные изменения.

class WebServiceDevolucionESA : WebserviceInterface
{

    var mutableLiveData = MutableLiveData<StateDevol>()

    override fun invoke(reference: String) : MutableLiveData<StateDevol> {
        mutableLiveData.value = StateDevol.Loading
        val interceptor = HttpLoggingInterceptor()
        interceptor.setLevel(HttpLoggingInterceptor.Level.BODY)
        val client = OkHttpClient.Builder().addInterceptor(interceptor).build()

        val retrofit = Retrofit.Builder()
            .baseUrl("BASE_URL")
            .addConverterFactory(GsonConverterFactory.create())
            .client(client)
            .build()

        val service = retrofit.create(Api_Devolucion_R::class.java)

        /*PREPARACION DE CUERPO*/
        var jsonInputString  =  "...A JSON..."
        val requestBody = RequestBody.create(MediaType.parse("text/plain"), jsonInputString)

        val call = service.doReturn(requestBody)

        call.enqueue(object : Callback<ReturnPojo> {
            override fun onResponse(call: Call<ReturnPojo>, response: Response<ReturnPojo>) =
                if (response.code() == 200) {
                    val responseString = response.body()
                    mutableLiveData.value = StateDevol.Success
                    System.out.println("Set after return")
                }
                else
                {
                    mutableLiveData.value = (StateDevol.showError("Partial Error"))

                }
            override fun onFailure(call: Call<ReturnPojo>, t: Throwable) {
                System.out.println("Fatal Error")
                mutableLiveData.value = StateDevol.showError("Fatal Error")
            }
        })
        System.out.println("Exit")
        return mutableLiveData
    }
}

Возвращает эту информацию в хранилищекласс

class RepoDev(private val webserviceDevol: WebserviceInterface)
{
    fun invoke(reference: String) : LiveData<StateDevol>
    {
        return web.invoke(reference)
    }
}

Модель представления

class ModelViewDev ( private val repo : RepoDev) : ViewModel()
{

    var state =  MutableLiveData<StateDevol>()
    fun dispatch(reference: String)
    {
        state.value = repo.invoke(reference).value
    }


    fun getStatus(): LiveData<StateDevol> {
        return state
    }
}

class ModelViewDev Factory(private val repo: RepoDev) : ViewModelProvider.Factory {
    override fun <T : ViewModel> create(modelClass: Class<T>): T {
        return ModelViewDev (repo) as T
    }
}

И, наконец, представление

viewModel = ViewModelProviders.of(this, ModelViewDevolucionFactory(RepositorioDevolucion(WebServiceDevolucionESA())))
            .get(ModelViewDevolucion::class.java)
        //viewModel.getStatus().observe(this, stateObserverChanged)
        viewModel.state.observe(::getLifecycle, ::updateUI)


    private fun updateUI(estado: StateDevol?) {
        when (estado) {
            StateDevol.Loading -> unableButton()
            StateDevol.Success -> returnOK()
            is StateDevol.showError -> changeError(estado.error)
        }
    }

Как я уже сказал, я получаю первый сигнал "Загрузка", но незначение обратного вызова из функции постановки в очередь (успех или ошибка)

...