You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Java中Retrofit的Callback回调代码转换为Kotlin

将Java调用Services.nfGetIncreasedRiskZones的代码转换为Kotlin

基础转换(保留原Raw Type)

由于Retrofit的Callback接口包含两个抽象方法(onResponse和onFailure),无法使用Kotlin的SAM Lambda简化,需要用object表达式实现接口:

Services.nfGetIncreasedRiskZones(object : Callback {
    override fun onResponse(call: Call, response: Response) {
        // 实现成功响应逻辑
    }

    override fun onFailure(call: Call, t: Throwable) {
        // 实现失败处理逻辑
    }
})

推荐优化:添加泛型(避免Raw Type)

原Java代码使用了未指定泛型的Call和Callback,在Kotlin中建议明确泛型类型,提升代码安全性和可读性:

1. 先更新接口与服务方法的泛型定义

修改NfGetIncreasedRiskZones接口(假设返回数据模型为RiskZoneList):

interface NfGetIncreasedRiskZones {
    @GET(Constants.NfGetIncreasedRiskZones)
    fun getRiskZones(): Call<RiskZoneList>
}

更新Services中的方法:

fun nfGetIncreasedRiskZones(callback: Callback<RiskZoneList>) {
    val service = App.getRetrofitWithHeaders(App.getBaseUrl())
        .create(NfGetIncreasedRiskZones::class.java)
    val call = service.getRiskZones()
    call.enqueue(callback)
}

2. 带泛型的调用代码

Services.nfGetIncreasedRiskZones(object : Callback<RiskZoneList> {
    override fun onResponse(call: Call<RiskZoneList>, response: Response<RiskZoneList>) {
        if (response.isSuccessful) {
            val riskZones = response.body()
            // 处理获取到的风险区域数据
        } else {
            // 处理HTTP错误码(如404、500等)
        }
    }

    override fun onFailure(call: Call<RiskZoneList>, t: Throwable) {
        // 处理网络请求异常,例如打印错误日志或提示用户
    }
})

更 Kotlin 化的写法:使用Coroutines(Retrofit 2.6+)

如果项目使用Retrofit 2.6及以上版本,推荐用协程替代Callback回调,代码更简洁:

1. 修改接口为挂起函数

interface NfGetIncreasedRiskZones {
    @GET(Constants.NfGetIncreasedRiskZones)
    suspend fun getRiskZones(): Response<RiskZoneList>
}

2. 更新服务方法

suspend fun nfGetIncreasedRiskZones(): Response<RiskZoneList> {
    val service = App.getRetrofitWithHeaders(App.getBaseUrl())
        .create(NfGetIncreasedRiskZones::class.java)
    return service.getRiskZones()
}

3. 协程方式调用

// 在协程作用域内调用(如ViewModel的viewModelScope、Activity的lifecycleScope)
lifecycleScope.launch {
    try {
        val response = Services.nfGetIncreasedRiskZones()
        if (response.isSuccessful) {
            val riskZones = response.body()
            // 主线程更新UI
        } else {
            // 处理HTTP错误
        }
    } catch (e: Exception) {
        // 处理网络异常
    }
}

内容的提问来源于stack exchange,提问作者Neigaard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 19:45:42