如何将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
相关产品推荐
相关产品推荐

