Поправка2 ставит очередь на Response () в Котлине - PullRequest
0 голосов
/ 08 июня 2018

Функция возвращает значение NULL, прежде чем data.value устанавливается в асинхронном onResponse ().Как заставить его сначала получать данные, а затем возвращать эти данные?

fun getNews(code: String): LiveData<List<News>>{

    val call = service.getNewsByCountry(code, Constant.API_KEY)

    var data = MutableLiveData<List<News>>()

    call.enqueue(object : Callback<NewsResponse> {
        override fun onFailure(call: Call<NewsResponse>?, t: Throwable?) {
            Log.v("retrofit", "call failed")
        }

        override fun onResponse(call: Call<NewsResponse>?, response: Response<NewsResponse>?) {
            data.value = response!!.body()!!.articles
        }

    })

    return data
}

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

Вы делаете асинхронный вызов, поэтому data.value не будет установлен, пока этот асинхронный вызов не разрешится.Однако, поскольку вы генерируете MutableLiveData, вы должны иметь возможность наблюдать, что даст вам обновление, когда ваш асинхронный вызов установит значение.

0 голосов
/ 08 июня 2018

Попробуйте

fun getNews(code: String): LiveData<List<News>>{

    val call = service.getNewsByCountry(code, Constant.API_KEY)
    var data = MutableLiveData<List<News>>()
    doAsync {
        call.enqueue(object : Callback<NewsResponse> {
            override fun onFailure(call: Call<NewsResponse>?, t: Throwable?) {
                Log.v("retrofit", "call failed")
            }

            override fun onResponse(call: Call<NewsResponse>?, response: Response<NewsResponse>?) {
                data.value = response!!.body()!!.articles
            }

        })
    }

    return data
}

Если не существует doAsync попробуйте добавить, следуйте anko зависимости от вашего app/build.gralde

implementation "org.jetbrains.anko:anko-design:0.10.5"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...