android lambda回调

一 下面lambda表达式的含义是什么

复制代码
1
// 观察 ViewModel 的结果
viewModel.doWork { result ->
findViewById<TextView>(R.id.tvViewModelResult).text = "ViewModel: $result"
}


2 		
fun doWork(callback: (String) -> Unit) {
val result1 = someClass.doSomething()
val result2 = someOtherClass.doSomething()
callback("$result1, $result2")
} 

这段代码涉及 Lambda 回调 机制,它的作用是异步或延迟地获取 doWork 方法执行后的结果,并在外部(比如 UI 层)进行处理。

代码解析


1. 观察 ViewModel 的结果
kotlin 复制代码
viewModel.doWork { result ->
    findViewById<TextView>(R.id.tvViewModelResult).text = "ViewModel: $result"
}
  • 这里 viewModel.doWork 是一个方法,它接收一个 Lambda 回调 ,即 { result -> ... }
  • resultdoWork 方法执行完成后,回传的结果
  • findViewById<TextView>(R.id.tvViewModelResult).text = "ViewModel: $result" 这行代码的意思是:当 doWork 任务完成后,将 result 赋值给 TextView,在 UI 界面显示出来。

2. doWork 方法定义
kotlin 复制代码
fun doWork(callback: (String) -> Unit) {
    val result1 = someClass.doSomething()
    val result2 = someOtherClass.doSomething()
    callback("$result1, $result2")
}
  • doWork 方法接收一个参数 callback,类型是 (String) -> Unit,即 一个以 String 为参数、无返回值的 Lambda 表达式
  • someClass.doSomething()someOtherClass.doSomething() 是执行的两个操作,它们可能返回字符串类型的结果。
  • callback("$result1, $result2")
    • 这个 callback 就是上面调用 doWork 时传入的 { result -> ... } Lambda。
    • "$result1, $result2" 生成一个字符串,格式类似 "value1, value2"
    • 这个字符串作为参数,传递给 callback,从而调用 { result -> ... } 代码块,并将 "$result1, $result2" 赋值给 result

result 是什么?

  • resultdoWork 任务执行后,回传给 Lambda 代码块的结果
  • 具体值取决于 someClass.doSomething()someOtherClass.doSomething() 的返回值。

callback("$result1, $result2") 是什么?

  • callback("$result1, $result2") 的作用是:
    • 生成一个字符串 "$result1, $result2"(比如 "Hello, World")。
    • 调用外部传入的 Lambda 代码块,并把这个字符串作为参数传递出去。

执行流程示例

假设:

kotlin 复制代码
class SomeClass {
    fun doSomething(): String = "Hello"
}

class SomeOtherClass {
    fun doSomething(): String = "World"
}

val someClass = SomeClass()
val someOtherClass = SomeOtherClass()

那么 doWork 执行后:

kotlin 复制代码
doWork { result -> println("回调结果: $result") }

会输出:

复制代码
回调结果: Hello, World

总结

  1. doWork 方法执行后,someClass.doSomething()someOtherClass.doSomething() 生成两个字符串。
  2. callback("$result1, $result2") 将它们拼接,并调用外部 Lambda 代码块,把结果传出去。
  3. result 是 Lambda 代码块接收的参数,即 "Hello, World" 这样的字符串。
  4. viewModel.doWork 调用时,最终 TextView 显示 "ViewModel: Hello, World"

这种方式适用于异步任务或解耦逻辑的情况,比如 网络请求、数据库操作、后台计算等,执行完成后用回调通知 UI 层更新数据。

相关推荐
廋到被风吹走1 小时前
【数据库】【MySQL】InnoDB外键解析:约束机制、性能影响与最佳实践
android·数据库·mysql
峥嵘life2 小时前
Android16 EDLA 认证测试CTS问题分析解决
android·java·服务器
惟恋惜3 小时前
Jetpack Compose 的状态使用之“界面状态”
android·android jetpack
_李小白5 小时前
【Android FrameWork】第二十六天:BroadcastReceiver
android
@#---6 小时前
如何准确判断json文件并且拿到我想要的信息
android·python·json
程序员陆业聪8 小时前
Android插件化原理与方案详解
android
惟恋惜9 小时前
Jetpack Compose 界面元素状态(UI Element State)详解
android·ui·android jetpack
_李小白10 小时前
【Android FrameWork】延伸阅读:IGraphicBufferProducer驱动UI绘制过程
android·ui
_李小白11 小时前
【Android FrameWork】第二十八天:Activity 的 UI 绘制全过程
android·ui
_李小白12 小时前
【Android FrameWork】第三十天:Surface创建流程解析
android