Я пытаюсь создать приложение с веб-сервисом + модернизация и асинхронный обратный вызов.
У меня есть запечатанный 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)
}
}
Как я уже сказал, я получаю первый сигнал "Загрузка", но незначение обратного вызова из функции постановки в очередь (успех или ошибка)