观察LiveData,您可以使用手动观察LiveData.observe()或LiveData.observeAsState()应用程序编程接口
LiveData.observe()
创建MutableState数据
创建Observer对象
观察LiveData
移除Observer对象来自LiveData
@Composable
fun LiveDataScreen() {
val viewModel: LiveDataViewModel = viewModel()
val lifecycleOwner = LocalLifecycleOwner.current
//(1) Create a MutableState data
val manualObserveLiveDataState:MutableState<Int?> =
remember { mutableStateOf(null) }
//(2) Create an observer object
val liveDataObserver = remember {
Observer<Int> { value ->
manualObserveLiveDataState.value = value
}
}
Column {
Button(onClick = {
//(3) Observe the LiveData
viewModel.liveData.observe(lifecycleOwner, liveDataObserver)
}) {
Text(text = "Manually Start Observe LiveData")
}
Button(onClick = {
// (4) Remove the observer from LiveData
viewModel.liveData.removeObserver(liveDataObserver)
}) {
Text(text = "Manually Remove Observer")
}
}
}
在上面的步骤2中,remember {}创建观察员对象,这样我们就不会重新创建Observer对象在重新配置期间的每次。我犯了这个错误。因此,它会导致内存泄漏观察者的增长。
LiveData.observeastate()
@Composable
fun LiveDataScreen() {
val viewModel: LiveDataViewModel = viewModel()
// Create MutableState by observing the LiveData
val observeAsStateLiveData =
viewModel.liveData.observeAsState(initial = null)
}
在内部,它调用DisposableEffect()副作用。其中最重要的是 onDispose()负责移除Observer对象在效果离开合成时自动为您生成。
@Composable
fun <R, T : R> LiveData<T>.observeAsState(initial: R): State<R> {
val lifecycleOwner = LocalLifecycleOwner.current
val state = remember { mutableStateOf(initial) }
DisposableEffect(this, lifecycleOwner) {
val observer = Observer<T> { state.value = it }
observe(lifecycleOwner, observer)
onDispose { removeObserver(observer) }
}
return state
}
研究setValue()与postValue()的行为
研究行为setValue()与 postValue(),可以尝试以下几种情况:
活动已创建/停止(在后台不可见)
活动已启动/暂停(在后台可见)
活动已恢复(在前台可见)
用户界面忙时
在主线程中运行postValue()
模拟用户界面正忙
要模拟UI繁忙,您可以快速发出该值
job = viewModelScope.launch {
repeat(10000) { value ->
delay(1)
_liveData.postValue = value
}
}
Button(onClick = {
Thread.sleep(3000)
}) {
Text(text = "Simulate Busy UI")
}
模拟活动暂停
要模拟某个活动暂停/失去焦点,可以在当前应用程序上启动另一个透明活动。
在观察者对象中添加登录
为了证明数据已发送到UI,您将以下日志记录添加到Observer对象
val liveDataObserver = remember {
Observer<Int> { value ->
Log.d(tag, "[ManualObserver]: Assigning $value to manualObserveLiveDataState.value")
manualObserveLiveDataState.value = value
}
}
setValue()与postValue()
在执行各种场景后,以下是setValue()和 postValue()
研究observe()与observeAsState()的行为
如果你使用observe(),您需要手动调用移除观察者()应用程序编程接口。如果你使用observeAsState()(使用 有效效果在内部),它会自动调用removeObserver()当 有效效果离开作文。
以下是要尝试的场景:
活动已创建/停止(在后台不可见)
活动已启动/暂停(在后台可见)
活动已恢复(在前台可见)
屏幕旋转被破坏
离别作文
模拟离开构图
要模拟离开组合,可以实现CommonScreen()下面的可组合功能,包含隐藏和显示实际可组合的按钮内容.当content是隐藏的,它模拟离开的构图。
@Composable
fun CommonScreen(content: @Composable () -> Unit) {
var showContent by rememberSaveable { mutableStateOf(true) }
val context = LocalContext.current
Column(modifier = Modifier.verticalScroll(rememberScrollState())){
if (showContent) {
content()
Button(onClick = {
showContent = false
}) {
### 最后我想说
**为什么很多程序员做不了架构师?**
1、良好健康的职业规划很重要,但大多数人都忽略了
2、学习的习惯很重要,持之以恒才是正解。
3、编程思维没能提升一个台阶,局限在了编码,业务,没考虑过选型、扩展
4、身边没有好的架构师引导、培养。所处的圈子对程序员的成长影响巨大。
金九银十面试季,跳槽季,整理面试题已经成了我多年的习惯!**在这里我和身边一些朋友特意整理了一份快速进阶为Android高级工程师的系统且全面的学习资料。涵盖了Android初级——Android高级架构师进阶必备的一些学习技能。**
附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)
![](https://img-blog.csdnimg.cn/img_convert/6e2ad9752c306824025cf24b40fd1a97.webp?x-oss-process=image/format,png)
**里面包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…**
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化学习资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618156601)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化学习资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618156601)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**