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 -> ... }。
  • result 是 doWork 方法执行完成后,回传的结果。
  • 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 是什么?

  • result 是 doWork 任务执行后,回传给 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 层更新数据。

相关推荐
换元不配限2 小时前
从 AsyncTask 到现代并发:Android 异步方案的演进与替代实践
android·asynctask·异步编程·方案对比·asynctask替代方案
用户2018792831672 小时前
你的 App 为什么是「电量刺客」?——从一条 WakeLock 追到 Linux 内核的 Android 省电原理全解
android
mmsx2 小时前
Android 安全校验下沉到原生层:防 patch 与构建期自动化
android·安全·自动化
老牛日常随笔4 小时前
Google把Android测试搬进AI对话:ARTEMIS如何用自然语言操作你的手机
android·人工智能·智能手机
朱涛的自习室4 小时前
预算 1000 美金的开源软件,DeepSeek 只花 1 美金就做完了(Day 6)
android·前端·人工智能
mmsx5 小时前
Android APK 加固方案怎么落地:从加壳到校验的组合取舍
android·网络·安全·签名
hunterandroid5 小时前
Navigation Component 工程落地:从单 Activity 架构到深度链接配置
android·前端
撩得Android一次心动6 小时前
Jetpack Compose 知识点整理3【个人用】
android·笔记·学习·kotlin·android compose
Kapaseker6 小时前
别再只会写 <T>:Kotlin 泛型的实战用法
android·kotlin