Android Retrofit enqueue 方法没有 return 值
Android Retrofit enqueue method does not return value
fun getSurvey() : MutableList<SurveyMaster>{
//Retrofit creates implementation for this method getSurveyList()
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)
//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
}
val surveys = response.body()
for(element in surveys!!){
surveyList.add(element)
}
}
})
return surveyList
}
入队方法在后台线程上运行,但是如何return入队方法中的列表。上面的代码 returns 空列表。提前致谢
这是一个异步调用,因此 onResponse
是在网络调用成功之后调用的,而您在此之前正在 returning 列表。您需要使用回调 return 数据。像这样修改你的函数:
fun getSurvey(onComplete: (MutableList<SurveyMaster>) -> Unit) {
//Retrofit creates implementation for this method getSurveyList()
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)
//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
}
val surveys = response.body()
for(element in surveys!!){
surveyList.add(element)
}
onComplete.invoke(surveyList)
}
})
}
然后像这样调用你的方法:
getSurvey { list ->
// Do something with your list.
}
根据您的问题,您可能还想 return 一些 onFailure 事件以在网络请求未成功时获知。
正如您已经提到的那样,enqueue 将在后台线程上执行此 API 调用,因此您的函数将始终 return 空列表,因为现在没有收到来自 [=21= 的响应] ,所以你提到的这个循环:-
for(element in surveys!!){
surveyList.add(element)
}
此循环稍后将 运行(当收到 API 的响应时),同时您 returned 列表在 instant.Here 处为空不能直接从方法中 return 数据。
您可以使用接口使用回调方法。由于您已经将响应作为列表获得,因此无需创建单独的列表并将数据添加到其中。
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)
}
现在有了成功和失败回调,您可以处理这两种情况。
fun getSurvey() : MutableList<SurveyMaster>{
//Retrofit creates implementation for this method getSurveyList()
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)
//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
}
val surveys = response.body()
for(element in surveys!!){
surveyList.add(element)
}
}
})
return surveyList
}
入队方法在后台线程上运行,但是如何return入队方法中的列表。上面的代码 returns 空列表。提前致谢
这是一个异步调用,因此 onResponse
是在网络调用成功之后调用的,而您在此之前正在 returning 列表。您需要使用回调 return 数据。像这样修改你的函数:
fun getSurvey(onComplete: (MutableList<SurveyMaster>) -> Unit) {
//Retrofit creates implementation for this method getSurveyList()
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)
//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
}
val surveys = response.body()
for(element in surveys!!){
surveyList.add(element)
}
onComplete.invoke(surveyList)
}
})
}
然后像这样调用你的方法:
getSurvey { list ->
// Do something with your list.
}
根据您的问题,您可能还想 return 一些 onFailure 事件以在网络请求未成功时获知。
正如您已经提到的那样,enqueue 将在后台线程上执行此 API 调用,因此您的函数将始终 return 空列表,因为现在没有收到来自 [=21= 的响应] ,所以你提到的这个循环:-
for(element in surveys!!){
surveyList.add(element)
}
此循环稍后将 运行(当收到 API 的响应时),同时您 returned 列表在 instant.Here 处为空不能直接从方法中 return 数据。
您可以使用接口使用回调方法。由于您已经将响应作为列表获得,因此无需创建单独的列表并将数据添加到其中。
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)
}
现在有了成功和失败回调,您可以处理这两种情况。