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 层更新数据。

相关推荐
wy3136228211 小时前
android——开发中的常见Bug汇总与解决方案(闪退)
android·bug
小小测试开发2 小时前
实战派SQL性能优化:从语法层面攻克项目中的性能瓶颈
android·sql·性能优化
QuantumLeap丶3 小时前
《Flutter全栈开发实战指南:从零到高级》- 26 -持续集成与部署
android·flutter·ios
StarShip4 小时前
从Activity.setContentView()开始
android
千里马学框架4 小时前
重学SurfaceFlinger之Layer显示区域bounds计算剖析
android·智能手机·sf·安卓framework开发·layer·surfaceflinger·车载开发
nono牛5 小时前
安卓休眠与唤醒流程
android
二流小码农6 小时前
鸿蒙开发:个人开发者如何使用华为账号登录
android·ios·harmonyos
StarShip7 小时前
Android View框架概览
android·计算机图形学
愤怒的代码7 小时前
解析Android内存分析的指标
android·app
summerkissyou19877 小时前
android-hardware/interfaces/automotive和hardware/libhardware/include/hardware区别
android