安卓MVI架构真的来了?动手试着封装吧(一)下

简介: 安卓MVI架构真的来了?动手试着封装吧(一)

2. 模板,模板!


抛开事实事件倒灌的问题不谈, 再回头看看谷歌推荐的写法:


lifecycleScope.launch {
            repeatOnLifecycle(Lifecycle.State.STARTED) {
                // Bind the visibility of the progressBar to the state
                // of isFetchingArticles.
                viewModel.uiState
                    .map { it.isFetchingArticles }
                    .distinctUntilChanged()
                    .collect { progressBar.isVisible = it }
            }
        }

  map操作符的作用是过滤uiState中的其他参数,distinctUntilChanged操作符是消抖,collect操作符是收集,非常的直观,非常的易懂。

  但是,如果你对kotlin的Flow不太了解的话,你也许会写出下面的代码


lifecycleScope.launch {
            repeatOnLifecycle(Lifecycle.State.STARTED) {
                viewModel.uiState
                    .map { it.isFetchingArticles }
                    .distinctUntilChanged()
                    .collect { progressBar.isVisible = it }
                viewModel.uiState
                .map { it.xxx }
                .distinctUntilChanged()
                .collect { doSomeThing() }
                viewModel.uiState
                    .map { it.yyy }
                    .distinctUntilChanged()
                    .collect { doSomeThing( }
            }
        }

  看起来一切都没问题,继续收集其他属性,然后执行不同的操作,然而实际上等你真的把代码运行起来的时候,会发现除了第一个属性的收集是有相应的以外,其他的属性均收不到最新的值。

  出现这个问题的原因是因为collect是suspend方法,他会阻塞下面的代码的执行,因此你需要给每一个collect都套一层launch方法,即开启多个协程,防止协程挂起导致下面的代码无法运行:


lifecycleScope.launch {
            repeatOnLifecycle(Lifecycle.State.STARTED) {
                launch{
                    viewModel.uiState
                        .map { it.isFetchingArticles }
                        .distinctUntilChanged()
                        .collect { progressBar.isVisible = it }
                }
                launch{
                    viewModel.uiState
                        .map { it.xxx }
                        .distinctUntilChanged()
                        .collect { doSomeThing() }
                } 
                launch{
                    viewModel.uiState
                        .map { it.xxx }
                        .distinctUntilChanged()
                        .collect { doSomeThing() }
                } 
            }
        }

  恭喜你问题解决了,但是产生了一大堆模板代码,最核心的逻辑其实只包括2样:

  1. 要订阅的属性
  2. 获取到新值后的逻辑

  谷歌的开发者文档对于入门MVI架构是非常合适的,但是谷歌只提供了非常基础的解决方案,并没有对这些逻辑做进一步的封装(这并不怪谷歌毕竟一个架构有非常多种实现方案,而且在一篇入门文章中阐述进阶的封装并不合适),因此我们需要封装来帮助我们解决掉这些难看的模板代码。


相关文章
|
1月前
|
前端开发 JavaScript 测试技术
android做中大型项目完美的架构模式是什么?是MVVM吗?如果不是,是什么?
android做中大型项目完美的架构模式是什么?是MVVM吗?如果不是,是什么?
83 2
|
1月前
|
存储 前端开发 Java
Android MVVM架构模式下如何避免内存泄漏
Android采用MVVM架构开发项目,如何避免内存泄漏风险?怎样避免内存泄漏?
85 1
|
2月前
|
IDE Android开发 iOS开发
深入解析Android与iOS的系统架构及开发环境差异
本文旨在探讨Android和iOS两大主流移动操作系统在系统架构、开发环境和用户体验方面的显著差异。通过对比分析,我们将揭示这两种系统在设计理念、技术实现以及市场策略上的不同路径,帮助开发者更好地理解其特点,从而做出更合适的开发决策。
140 2
|
4天前
|
前端开发 JavaScript 测试技术
android做中大型项目完美的架构模式是什么?是MVVM吗?如果不是,是什么?
在 Android 开发中,选择合适的架构模式对于构建中大型项目至关重要。常见的架构模式有 MVVM、MVP、MVI、Clean Architecture 和 Flux/Redux。每种模式都有其优缺点和适用场景,例如 MVVM 适用于复杂 UI 状态和频繁更新,而 Clean Architecture 适合大型项目和多平台开发。选择合适的架构应考虑项目需求、团队熟悉度和可维护性。
23 5
|
4天前
|
安全 搜索推荐 Android开发
深入探索Android与iOS的系统架构差异
【10月更文挑战第29天】 在当今的智能手机市场中,Android和iOS无疑是两大主流操作系统。本文旨在深入探讨这两个系统的架构差异,从底层的操作系统设计到用户界面的呈现,以及它们如何影响了开发者和用户的体验。通过对比分析,我们可以更清晰地理解这两种平台的优势与局限,为开发者在选择开发平台时提供有价值的参考,同时也为用户选择设备提供一定的指导。
16 2
|
13天前
|
前端开发 JavaScript 测试技术
Android适合构建中大型项目的架构模式全面对比
Android适合构建中大型项目的架构模式全面对比
30 2
|
14天前
|
存储 前端开发 测试技术
Android kotlin MVVM 架构简单示例入门
Android kotlin MVVM 架构简单示例入门
22 1
|
5天前
|
前端开发 Java 测试技术
android MVP契约类架构模式与MVVM架构模式,哪种架构模式更好?
android MVP契约类架构模式与MVVM架构模式,哪种架构模式更好?
9 0
|
1月前
|
前端开发 Java 测试技术
android MVP契约类架构模式与MVVM架构模式,哪种架构模式更好?
android MVP契约类架构模式与MVVM架构模式,哪种架构模式更好?
19 2
|
1月前
|
安全 Android开发 iOS开发
深入解析:安卓与iOS的系统架构及其对应用开发的影响
本文旨在探讨安卓与iOS两大主流操作系统的架构差异,并分析这些差异如何影响应用开发的策略和实践。通过对比两者的设计哲学、安全机制、开发环境及性能优化等方面,本文揭示了各自的特点和优势,为开发者在选择平台和制定开发计划时提供参考依据。
48 4