Android中使用suspendCancellableCoroutine让你的首页运营弹窗能按照一个一个展示

2023-12-27 12:48:12

前言背景

在日常开发App的过程中,大家应该都有首页写运营弹窗的需求,随着业务的复杂和变态,运营老哥恨不得在首页各种谈,千人千面,可能你的首页是一个List里面包含了各种弹窗的数据,那么我们到底怎么处理这些多个的弹窗的呢?

实现背景

1、如果我们粗暴点的处理,直接遍历For循环,各种showDialog。当然这样处理确实我们的Dialog没毛病,都一股脑全展示出来了,这里面可能存在些许问题;第一:如果List是后台给定的顺序这时候可能刚好相反,因为按照遍历最后的展示在最上层(有些老哥可能就说了,我TM不能reverse来遍历么???可以,当然可以),但是这样还有个问题就是所有的弹框都现实出来了,如果大小背景都一样还好,不一样背后的背景可能重叠,所以要解决的问题是我们能不能让这些弹窗按照List返回的顺序依次一个一个打开展示,关闭掉一个弹窗的时候才打开第二个弹窗;当然,有些老哥肯定会说,写个方法,传入集合的List和当前处理的角标,通过逻辑处理也能实现,确实是这样的,但是我们有没有一些好用简便的方法呢?那就是今天的主角suspendCancellableCoroutine

2、如果我们的Android项目是基于kotlin书写的,那么基本上都引入了协程Coroutine,我们是不是将弹窗的Dialog方法的调用放在一个suspend挂起函数里面呢?如果是个挂起函数suspend,我们通过协程作域启动会等挂起函数执行完毕,如果里面是个展示Dialog的普通函数,其实书写了suspend开发工具也会提示无需使用suspend修饰,怎么才能让这个挂起函数能真正的挂起并能在需要取消挂起的时候回到前台任务呢?答案当然是有的

实现细节

有了上面的问题的引入和铺垫,我们大致知道需要怎么实现,我们看看具体怎么实现

看看具体的日志输出,是不是实现了我们说的效果:

当然,我们除了使用这种方式也有很多方式能实现,比如在掘金上看到有大佬基于Flow封装的FlowTask也能实现,不错感觉相比这个代码可能精简一点点;除了这种以外,使用Jetpack的WorkManager也能很好的实现这种效果,不过同样的代码可能也相对要多一点点(基于WorkManager的伪代码如下所示)

WorkManager.getInstance(appContext).beginWith(worker1).then(worker2).enqueue()

文章来源:https://blog.csdn.net/wcsandlili/article/details/135229413
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。