Как вы уже упоминали, enqueue будет выполнять этот вызов API в фоновом потоке, поэтому ваша функция всегда будет возвращать пустой список, так как сейчас ответ от API не получен, поэтому это l oop, о котором вы упомянули: -
for(element in surveys!!){
surveyList.add(element)
}
Этот l oop будет запущен позже (когда будет получен ответ от API), пока вы вернули список, который на данный момент пуст. Здесь вы не можете напрямую вернуть данные из метода .
Вы можете использовать обратный вызов с использованием интерфейсов. Поскольку вы уже получаете ответ в виде списка, нет необходимости создавать отдельный список и добавлять в него данные.
fun getSurvey(onGetSurveyListener: OnGetSurveyListener){
val call : Call<List<SurveyMaster>> = retrofitPlaceHolderAPI.getSurveyList("bearer "+customIDToken)
val surveyList = mutableListOf<SurveyMaster>()
//enqueue - executing on the background thread, to execute asynchronously
call.enqueue(object : Callback<List<SurveyMaster>>{
override fun onFailure(call: Call<List<SurveyMaster>>, t: Throwable) {
Log.e("Error", t.message)
onGetSurveyListener.onGetSurveyFailure(t.localizedMessage)
//Log.e("Error", t.localizedMessage)
}
override fun onResponse(call: Call<List<SurveyMaster>>, response: Response<List<SurveyMaster>>) {
if (!response.isSuccessful){
Log.e("SurveyList Error", "code: "+response.code())
return
}
response.body?.let{list->
onGetSurveyListener.onGetSurveySuccess(list)
}
}
})
}
interface OnGetSurveyListener {
fun onGetSurveySuccess(surveyList:List<SurveyMaster>)
fun onGetSurveyFailure(errorMessage: String)
}
Теперь здесь с помощью обратных вызовов успеха и неудачи вы можете обрабатывать оба случая.