Не удалось получить ответ с помощью вызова API Retrofit Coroutine - PullRequest
2 голосов
/ 09 января 2020

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

class AuthActivityViewModel : ViewModel() {

    var authResp: LiveData<ObjAuthResp> = MutableLiveData()

    val repository = BaseRepository()

    fun login(username: String, password: String) {
        authResp = liveData(Dispatchers.IO) {
          val resp = repository.login(username, password)
            emit(resp)
        }
    }
}

, но он работает с этим кодом.

class AuthActivityViewModel : ViewModel() {

    val repository = BaseRepository()

    var authResp = liveData(Dispatchers.IO) {
        val resp = repository.login(username, password)
            emit(resp)
    }    

}

Служба API

@POST("profile/pub/auth/login")
suspend fun login(@Body authReqBody : ObjAuthReqBody): ObjAuthResp

BaseRepository

open class BaseRepository {

    suspend fun login(username:String,password:String) = service.login(ObjAuthReqBody( username, password))   
} 

Вызов из активности

   btn_login.setOnClickListener {
    viewModel.login(edt_username.text.toString(), 
    edt_password.text.toString())
    }

1 Ответ

1 голос
/ 09 января 2020

Отвечая на мой собственный вопрос,

проблема была в строке authResp = liveData(Dispatchers.IO) {... это создавало новые LiveData, в то время как старые наблюдатели наблюдали за начальным var authResp: LiveData<ObjAuthResp> = MutableLiveData(). Таким образом, поскольку Наблюдатели не слушают только что созданного LiveData, вызов даже не выполняется.

Этот код работает

  var authResp = MutableLiveData<ObjAuthResp>()

 fun login(username: String, password: String) {
        viewModelScope.launch {
            withContext(Dispatchers.IO) {
                val resp = repository.login(username, password)
                authResp.postValue( resp)

            }
        }
    }
...