如何在Kotlin类中初始化接口并向主Activity传递数据?
如何初始化ApiResponseListener接口并传递数据到主Activity
方式1:让主Activity直接实现接口
让主Activity实现ApiResponseListener接口,直接在Activity内部处理回调逻辑,同时将Activity实例作为接口对象传递给需要调用的模块。
// 主Activity实现接口 class MainActivity : AppCompatActivity(), ApiResponseListener { override fun didFetch(response: Response<RandomRecipeApiResponse>) { // 处理接口返回的成功数据,比如更新UI } override fun didError(msg: String) { // 处理错误信息,比如显示Toast提示 } // 示例:初始化请求模块并传入自身作为接口实例 private fun startRecipeRequest() { val recipeFetcher = RecipeFetcher(this) recipeFetcher.fetchRandomRecipe() } } // 示例请求类,接收ApiResponseListener实例 class RecipeFetcher(private val listener: ApiResponseListener) { fun fetchRandomRecipe() { // 模拟请求成功 val mockResponse = Response.success(RandomRecipeApiResponse()) listener.didFetch(mockResponse) // 模拟请求失败 listener.didError("获取食谱失败,请重试") } }
方式2:使用匿名内部类初始化接口
如果不想让Activity实现接口,可通过匿名内部类直接创建ApiResponseListener实例,在回调中处理逻辑(注意更新UI需切换到主线程)。
// 在主Activity中创建接口实例 val apiResponseListener = object : ApiResponseListener { override fun didFetch(response: Response<RandomRecipeApiResponse>) { runOnUiThread { // 处理成功数据,更新UI } } override fun didError(msg: String) { runOnUiThread { Toast.makeText(this@MainActivity, msg, Toast.LENGTH_SHORT).show() } } } // 直接调用接口方法传递数据 apiResponseListener.didError("test") apiResponseListener.didFetch(response)
方式3:用Kotlin Lambda简化实现
利用Kotlin特性,将接口包装成接收Lambda的类,简化代码编写:
// 包装类,将接口方法转为Lambda参数 class LambdaResponseListener( private val onSuccess: (Response<RandomRecipeApiResponse>) -> Unit, private val onFail: (String) -> Unit ) : ApiResponseListener { override fun didFetch(response: Response<RandomRecipeApiResponse>) = onSuccess(response) override fun didError(msg: String) = onFail(msg) } // 在主Activity中使用 val apiResponseListener = LambdaResponseListener( onSuccess = { response -> // 处理成功数据 }, onFail = { msg -> // 处理错误信息 } )
内容的提问来源于stack exchange,提问作者Mohsen Mashkour
相关产品推荐
相关产品推荐

