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)
}

现在有了成功和失败回调,您可以处理这两种情况。