我是靠谱客的博主 舒心钢笔,最近开发中收集的这篇文章主要介绍LaunchedEffect:在Jetpack Compose中使用协程LaunchedEffect使用方法实现原理,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

在这里插入图片描述

LaunchedEffect


LaunchEffect允许我们在Composable中使用协程

@Composable fun DisposableEffect(
    vararg keys: Any?, 
    effect: DisposableEffectScope.() -> DisposableEffectResult
): Unit
  • DisposableEffect一样,当Composable进入composition时执行block
  • 当Composable从树上detach时,CoroutineScope执行cancel
  • 参数keys发生变化是,会执行cancel后再次执行effect

简而言之,就是支持执行Coroutine的DisposableEffect,会自动执行cancel,不需要手动onDispose


使用方法


使用方式如下:

@Composable
fun SplashScreen(
    onTimeOut: () -> Unit
) {
    LaunchedEffect(Unit) { 
        delay(SplashWaitTime)
        onTimeOut()
    }
    ...
}

例如上面,在首次启动时显示开屏页。参数Unit,因为不会有diff,所以实现onActive的生命周期效果,即尽在首次composition时执行一次

@Composable
fun SearchScreen() {
    ...
    var searchQuery by remember { mutableStateOf("") }
    LaunchedEffect(searchQuery) {
        // execute search and receive result
    }
    ...
}

再如上,当检索词变化时,发起检索。

让Composable支持协程的重要意义是,可以让一些简单的业务逻辑直接Composable的形式封装并实现复用,而无需额外借助ViewModel。


实现原理


@Composable
@ComposableContract(restartable = false)
fun LaunchedEffect(
    subject: Any?,
    block: suspend CoroutineScope.() -> Unit
) {
    val applyContext = currentComposer.applyCoroutineContext
    remember(subject) { LaunchedEffectImpl(applyContext, block) }
}

实现非常简单,使用remember保存了subject参数,然后通过LaunchedEffectImpl启动协程

internal class LaunchedEffectImpl(
    parentCoroutineContext: CoroutineContext,
    private val task: suspend CoroutineScope.() -> Unit
) : CompositionLifecycleObserver {

    private val scope = CoroutineScope(parentCoroutineContext)
    private var job: Job? = null

    override fun onEnter() {
        job?.cancel("Old job was still running!")
        job = scope.launch(block = task)
    }

    override fun onLeave() {
        job?.cancel()
        job = null
    }
}

LaunchedEffectImpl可以提供CoroutineScope,借助CompositionLifecycleObserver提供的生命周期,进入屏幕时launch启动协程,离开屏幕时cancel取消协程。

最后

以上就是舒心钢笔为你收集整理的LaunchedEffect:在Jetpack Compose中使用协程LaunchedEffect使用方法实现原理的全部内容,希望文章能够帮你解决LaunchedEffect:在Jetpack Compose中使用协程LaunchedEffect使用方法实现原理所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部