如何将改造回调响应中的回调从 java 转换为 Kotlin

Posted

技术标签:

【中文标题】如何将改造回调响应中的回调从 java 转换为 Kotlin【英文标题】:How convert a callback inside retrofit callback response from java to Kotlin 【发布时间】:2019-05-09 00:50:02 【问题描述】:

我是 Kotlin 的新手,我有一个简单的问题: 我将我的所有项目从 java 转换为 kotlin,并成功地纠正了文档中的所有错误。

但我没有成功将 java 改造回调响应中的回调转换为 kotlin。

fun getUserAccountController(token: String, callback: UtilsCallback): Users 

        userAccountServices.getUserAccount(token).enqueue(object : Callback<Result> 
            override fun onResponse(call: Call<Result>, response: Response<Result>) 
                if (response.isSuccessful) 
                    Log.i("Callback TOKEN ok ==> ", response.body()!!.resultUser!!.name)
                    user.name = response.body()!!.resultUser!!.name
                    user.username = response.body()!!.resultUser!!.username

                    callback.onData(user) // ==> Here my CALLBACK function
                 else 
                    user.username = ""
                    user.name = ""
                    callback.onData(user) // ==> Here my CALLBACK function
                
            

            override fun onFailure(call: Call<Result>, t: Throwable) 
                Log.i("Callback TOKEN Nok ==> ", "error")
            
        )
        return user
    

我的回调是函数callback.onData

   Handler().postDelayed(
        user = userAccountController.getUserAccountController(token) 
            fullName!!.text = user.name
            firstName!!.text = user.name
            email!!.text = user.username
        
    , 50)

它通过上面的这个转换我的代码,我不明白为什么。

下面是错误信息:

也许,我必须使用另一种方式?我在该示例中的目的是从成功的异步响应中获取我的数据,以便更新我的活动。

感谢阅读。

编辑

我还发布了我以前运行良好的 JAVA 代码

new Handler().postDelayed(new Runnable()
        @Override
        public void run()
            user = userAccountController.getUserAccountController(token, new UtilsCallback() 
                        @Override
                        public void onData(Users userBack) 
                            fullName.setText(user.getName());
                            firstName.setText(user.getName());
                            email.setText(user.getUsername());
                        
                    );
        
    ,50);

编辑 2 @Roland 建议的我的新 kotlin 代码

    Handler().postDelayed(
        user = userAccountController.getUserAccountController(token, UtilsCallback 
            fullName!!.text = user.name
            firstName!!.text = user.name
            email!!.text = user.username
        )
    , 50)

编辑 3:我的 kotlin 界面

    package com.util.my3ciapplication

import com.model.my3ciapplication.Users

interface UtilsCallback 

    fun onData(user: Users)

【问题讨论】:

欢迎来到 SO!您的问题应包括所有相关详细信息,请将您的错误以文本(而不是图像)的形式发布。 【参考方案1】:

实际上它在图片中说......你使用() -&gt; Unit,你应该使用UtilsCallback代替......

可能以下内容已经生效:

Handler().postDelayed(
  user = userAccountController.getUserAccountController(token, UtilsCallback 
        fullName!!.text = user.name
        firstName!!.text = user.name
        email!!.text = user.username
    )
  , 50)

或者至少解决方案可能与此非常相似。

更新:我假设这是一个 Java 接口...对于您的第二个错误,还请查看 Kotlin: Interface ... does not have constructors。

在这种特定情况下,我宁愿将您的 UtilsCallback 替换为类似的适当功能对应物,例如() -&gt; Unit

【讨论】:

我试过了,但它不起作用:s 感谢您的回答 你这样做时遇到了什么问题? UtilsCallBack 是一个接口,所以它告诉我 n 接口不能有构造函数。 UtilsCallback 您好,首先感谢您的帮助。我发布了您建议我的代码,但出现以下屏幕错误。【参考方案2】:

感谢罗兰的帮助!

这是帮助的最终正确答案。

val obj = object : UtilsCallback
        override fun onData(user: Users) 
            fullName!!.text = user.name
            firstName!!.text = user.name
            email!!.text = user.username
        
    

    Handler().postDelayed(
        user = userAccountController.getUserAccountController(token, obj)
    , 50)

【讨论】:

虽然你可以这样做,但我宁愿建议你改用 Kotlin 函数式样式(例如 (Users) -&gt; Unit)......更是如此,如果该接口只是你得到的 Kotlin 接口,而转换你的 Java 代码 ;-)

以上是关于如何将改造回调响应中的回调从 java 转换为 Kotlin的主要内容,如果未能解决你的问题,请参考以下文章

改造 1.9 原始响应无法在成功回调中处理

从 Objective C 将回调/闭包转换为 Swift

如何将改造 JSON 响应转换为列表?

如何从对回调 URL 的响应中提取数据?

如何从 angularjs 中的 JSONP 错误回调中获取数据?

为改造创建 pojo 类和回调