напишите этот код:
fun getStoreTitles():List<sample> {
var responseResult:List<sample>
responseResult= listOf(sample("","",""))
val service = getRetrofitInstance()!!.create(GetDataService::class.java)
val call = service.getAllPhotos()
call.enqueue(object : Callback<List<sample>> {
override fun onResponse(call: Call<List<sample>>, response: Response<List<sample>>) {
responseResult=response.body()!!
var t=0
}
override fun onFailure(call: Call<List<sample>>, t: Throwable) {
/*progressDoalog.dismiss()*/
//Toast.makeText(this@MainActivity, "Something went wrong...Please try later!", Toast.LENGTH_SHORT).show()
}
});
return responseResult
}
и хотите вызвать этот метод из основного действия следующим образом:
var responseResult:List<sample>
val FrameWork=StoreTitle()
responseResult=FrameWork.getStoreTitles()
при запуске приложения модернизация выполняется успешно, но ничего не возвращается к ответному результату, и это значение равно null, я думаю, что модернизация запускает другой поток, и это причина. Как я могу решить эту проблему?
использовать обратный вызов для получения результатов API
@RajasekaranM, как я могу использовать обратный вызов?
проверить мой ответ
Обновите метод вызова API:
fun getStoreTitles(callback : Callback<List<sample>>) {
var responseResult:List<sample>
responseResult= listOf(sample("","",""))
val service = getRetrofitInstance()!!.create(GetDataService::class.java)
val call = service.getAllPhotos()
call.enqueue(callback);
}
вы должны вызвать так:
val FrameWork=StoreTitle()
FrameWork.getStoreTitles(object : Callback<List<sample>> {
override fun onResponse(call: Call<List<sample>>, response: Response<List<sample>>) {
val responseResult : List<sample>? =response.body()
//handle your success
}
override fun onFailure(call: Call<List<sample>>, t: Throwable) {
//handle your failure
}
})
зачем создавать новый интерфейс обратного вызова, когда вы можете использовать Retrofit Callback
(тот, который вам нужно предоставить методу enqueue
?
хороший вопрос, но он обработал свой вызов API в отдельном классе, поэтому
верно, но поскольку другой класс должен реализовать APICallback
в вашем примере, почему бы не реализовать Callback
Retrofit напрямую? Концептуально они делают одно и то же, т.е. обрабатывают ответ/сбой.
да вы правы, я не думаю об этом. спасибо :-) обновлю ответ
@RajasekaranM в этой строке --> <List<sample>> responseResult=response.body()!! get Ожидается вызов функции 'List<sample>(...)'
@behzadrazzaqi проверь сейчас
API вызовет фоновый поток и вернет ответ в методе onResponse(). поэтому вы всегда будете получать нулевое значение, потому что метод
getStoreTitles()
вернет значение до того, как API получит успех.