Android Retrofit enqueue方法没有返回值

2024-03-19

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
    }

Enqueue 方法在后台线程上运行,但如何在 enqueue 方法中返回列表。上面的代码返回空列表。提前致谢


就像您已经提到的那样,enqueue 将在后台线程上执行此 API 调用,因此您的函数将始终返回空列表,因为现在尚未从 API 收到任何响应,因此您提到的这个循环:-

for(element in surveys!!){
    surveyList.add(element)
}

这个循环将在稍后运行(当收到 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)
}

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android Retrofit enqueue方法没有返回值 的相关文章

随机推荐

  • 在 QML 中获取 $HOME 和/或用户名

    我需要知道如何获取用户的用户名和 或主目录 我用 google 搜索了一段时间 但只能找到 C 或 BASH 的变量 如何获取用户名或主目录 我正在用 QML 写作 这就是我的实现方式 Qml环境变量 h ifndef QMLENVIRON
  • C#5 ReadAsync 和迭代器

    我正在尝试将下面的类转换为延迟返回文件 public class ObservableFile2 IObservable
  • java.lang.IllegalArgumentException:端口超出范围:67001

    我在运行脚本时遇到以下错误 该脚本正在尝试调用 Web 服务 并且成功调用了 Web 服务 最后 它也打印了成功的消息 只是在中间抛出了一些带有 LOG UTILS 的错误 请大家看看并提出建议 java lang IllegalArgum
  • 在react.js中渲染新元素onClick

    我是反应新手 正在尝试在单击时渲染一个新元素 var LoginButton React createClass clickHandle function this rememberMe active localforage getItem
  • NextJS 公共环境变量不适用于 Azure 应用服务

    I have a NEXT PUBLIC environment variable in my NextJS application It has been set in my env local file and working corr
  • 如何检查文件是否为空

    我有一个文本文件 如何检查是否为空 gt gt gt import os gt gt gt os stat file st size 0 True
  • 如何使用 Room 预封装的数据库回调?

    版本 2 3 0 alpha03 Room 有一个prepackagedDatabaseCallback它说 This callback will be invoked after the pre package DB is copied
  • 类模板特化与函数重载

    我以为我想要模板函数专门化 但是这篇 stackoverflow 文章 https stackoverflow com questions 2197141 function template specialization importanc
  • 导出谷歌图表?

    我编写此代码是为了创建图表 表格和工具栏 google load visualization 1 packages corechart google load visualization 1 packages table google se
  • 新的 Facebook SDK FBSession sessionOpenWithPermissions

    我一直在尝试使用 Facebook 开发 iOS 应用程序 但我是新手 所以我一直在努力让 使用 Facebook 登录 按照 Facebook 上的教程并尝试实现它 但我遇到过 FBSession sessionOpenWithPermi
  • 在 Matlab 中将元胞数组打印为 .txt

    我有一个元胞数组 需要根据特定格式打印在 txt 文件中 我尝试过一些在线帮助 包括matlabcentraldlmcell但即便如此也没有给我想要的答案 分隔符是 t cellarray AAPL 2 20 2011 100 5 MSFT
  • 如何使用ActionBar 夏洛克?

    如何在 Android 应用程序中使用操作栏 sherlock 我已经尝试过该网站 但没有成功 我想要一个背景图像 将应用程序名称居中 操作栏中没有图标 我尝试过这段代码 http tinyurl com pguqag5以及中的例子这个链接
  • 枚举的单独类? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 将 git 存储库向下移动到层次结构级别

    我现在已经搜索了几个小时 但找不到令人满意的答案 尽管这似乎是一个简单的新手问题 我基本上想要完成的是将当前位于项目文件夹旁边的 git 目录移动到项目文件夹中 最好这根本不应该改变存储库历史记录 尽管我不知道这实际上是否可能 我想这样做的
  • Scrapy 中每个项目有多个页面

    免责声明 我对 Scrapy 还很陌生 简单地提出我的问题 如何从页面上的链接检索 Item 属性并将结果返回到同一个 Item 中 给出以下示例 Spider class SiteSpider Spider site loader Sit
  • Azure 函数服务总线输出消息属性

    我正在尝试使用服务总线绑定输出在 JavaScript Azure 函数中设置服务总线消息的元数据 不幸的是 绑定似乎只支持身体 查看文档 我发现您可以通过以下方式在服务总线触发器中访问此信息context bindingData但我没有看
  • 用 ImageMapType、Tile 边界框替换 Google 地图 v3 中的 GTileLayer?

    我需要更新这段代码 radar layer getTileUrl function tile zoom var llp new GPoint tile x 256 tile y 1 256 var urp new GPoint tile x
  • 自动启动android服务

    如何在Android 3 x中自动启动服务 测试平板电脑是三星Galaxy 10 1 我的代码可以在带有 android 2 2 1 的无名平板电脑上运行该代码也可以在带有 android 版本 3 x 的 android 模拟器中运行 C
  • 如何从 VirtualBox 中修改 /etc/hosts

    我有一个应用程序 我必须更改它 etc hosts文件才能命中 这是我的新文件 127 0 0 1 localhost 127 0 0 1 local connectwithme 这在我的本地机器上很容易工作 我只是去local conne
  • Android Retrofit enqueue方法没有返回值

    fun getSurvey MutableList