flutter flow(android flow)
一、Android真的推荐用MVI模式MVI和MVVM有什么区别
android自己卷自己,自己造一个MVI架构模式吗?
MVI架构模式是国内android开发者最近一两年造出来的吗?
看了很多MVI的资料,发现都提到cycle.js框架。android的mvi架构就是启发于cycle.js框架。
我们再看看Cycle.js框架是什么时候开始的,又是什么时候开始使用MVI模式的。
Cycle.js框架第一个预发版本:
再结合官方文档来看,Cycle.js框架就是为了MVI架构模式而生的。
虽然不知道,Cycle.js框架是不是首个MVI模式框架。
但是从很多资料可以推测,MVI架构模式就是Cycle.js框架推广开来的。
而且早在2014年就已经在前端开发中用得飞起了。
想想2014年,咱们在干嘛?android在用什么架构模式。
正所谓,天下武功出少林啊。
我们android的很多技术,在前端早就用“烂了”。
我们知道MVP和MVVM的爹都是MVC。MVI的爹也是MVC。
MVC的Controller是命令是编程组件,不能直接实现响应式编程思想。
响应式编程范式(Reactive programming):
安卓官方的compose框架、微信小程序、Flutter、React、鸿蒙UI的开发框架,都是使用响应式开发框架。
这里就不拓展开来讲了,上面提到的任何一个开发框架,你只要会一个基本就能理解响应式编程范式。
如果一个都不会也没关系,现在不理解响应式编程也没关系,等你学会MVI就理解了,这种只有实际使用过才能深刻理解。
学不会也没关系,不要焦虑(尤其那些工作不久的小伙伴,学不会属于正常现象~)
MVI,咱第一遍学不会,就等2年,再学一遍~
2年后也没学会,那就再等2年~一定要有耐心~
如果还是学不会,那也没关系,因为MVI早晚也会过时~等过时了就不用学了~
哈哈哈~别笑,正经Android可不会开玩笑的。
就像rxjava,当年有多少人死活学不会,android开发现在谁还学Rxjava?哈哈哈~
用一张图来总结这次升级的核心思想:
新版架构指南在旧版的基础上,做了如下调整和建议:
1.将LiveData组件改成了StateFlow
对协程的使用更友好。并且更能体现面向数据流开发的思想。
实际上,依然使用LiveData也没毛病。
2. ViewModel传递给View的数据限制为View的UIState
ViewModel从Model层获取数据后,转换为UIState数据,通过StateFlow流向View层。
UIState的数据面向界面组件而定义的,是能直接控制View组件如何显示的数据。
所以我们也可以称UIState为界面的状态或者View的状态。
如下:
3.单数据流还是多数据流的选择
官方指南并没有强制我们使用单流。
同一个界面应该使用单个StateFlow还是多个StateFlow,需要我们自己判断。
我们应该根据UIStates数据们之间关联程度来决定多流还是单流。
单流优缺点都十分明显:
优点:数据集中管控,会提高代码的可读性和修改的便利性。
缺点:当数据非常多且复杂时,会影响效率。因为我们没有diff功能,View层不能只更新有变化的数据,只会根据UIState刷新当前界面。
我们再看下官方新版架构图:
当然不仅仅MVVM可以改造成响应式开发范式,MVP也是可以的。
不信你看这篇blog:
1.理解MVC架构模式的思想【MVC是其他架构模式之爹,他的思想是MVP、MVVM、MVI的基础,学会它是关键步骤~】。
3.学习kotlin的StateFlow组件,的使用:Sequence->Flow->StateFlow。
4.学习ViewModel组件的使用(虽然不用ViewModel也能实现MVI架构,但是ViewModel还是值得学习)。
5.理解DRY(Don't Repeat Yourself)原则。
6.理解MVVM(因为官方的MVI模式是基于MVVM的基础改造的~)。
7.学习官方架构指南。
8.实战。
在这里就分享一份由大佬亲自收录整理的学习PDF+架构视频+面试文档+源码笔记,高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料
这些都是我现在闲暇时还会反复翻阅的精品资料。里面对近几年的大厂面试高频知识点都有详细的讲解。相信可以有效地帮助大家掌握知识、理解原理,帮助大家在未来取得一份不错的答卷。
当然,你也可以拿去查漏补缺,提升自身的竞争力。
真心希望可以帮助到大家,Android路漫漫,共勉!
如果你有需要的话,只需私信我【进阶】即可获取
二、MVVM框架中Kotlin Flow的实践
在 Google Android团队宣布了 Jetpack的视图模型之后,MVVM架构已经成为了 Android开发最流行的架构之一。如下图所示:
不过在 Google的前期官方文档中,其 Repository层是直接使用 LiveData的,而且连 Jetpack Room也对 LiveData进行了支持,接口可以直接返回 LiveData的数据。所以在很长一段时间内,各种开源的 MVVM框架或者博客中,也是在 Repository层中直接使用 LiveData。
这里,我们就会有疑问:Repository层为什么使用 LiveData呢?(因为通过官方文档介绍,LiveData应该要跟Acvtivity、Fragment这类UI组件有关系,需要依赖 Lifecycle,放在 Repository层非常奇怪)。
那么正确的做法是什么呢?下面将会演示基于 LiveData实践的 MVVM框架、其存在的弊端、以及基于 Flow实践的 MVVM框架,然后通过引入 Flow来解决 LiveData存在的问题。
首先将这张 MVVM框架图细化,来看看每个层级间的数据类型和数据流向:
然后再进一步细化,来看下设计细节:
以下是以请求网络数据为例:
UI层:
ViewModel层:
Repository层:
LiveData API设计得过于简单,难以应对Repository层可能出现的许多复杂的数据处理场景。主要体现在以下三个方面:
在复杂的业务场景中,往往伴随着线程切换来对数据进行多次处理,类似 RxJava的 observeOn以及 Flow的 flowOn,而 LiveData并没有这种能力。所以只能通过协程来进行线程切换,而在 Repository层,就只能自定义 repositoryScope并处理协程取消的逻辑。即:
LiveData肩负着为 UI提供数据订阅的能力,所以他的数据订阅只能在主线程,虽然可以在子线程通过 postValue去发布数据,但短期内调用 postValue过快,由于没有背压处理,只保留最新的数据,因此可能造成预期之外的数据丢失问题。
而 Flow则拥有完善的背压策略,可应对 Repository层可能出现的各种复杂数据场景。
LiveData依赖 Lifecycle,具有生命周期感知能力,遵循 activity和 fragment等实体的生命周期,在非 UI的场景中使用要么需要自定义 Lifecycle,要么使用 LiveData#observerForever(会造成泄露的风险)。在上面的案例中,ViewModel需要监听 Repositoy层的 LiveData,就必须特殊处理,避免内存泄露的问题。例如:
使用 Flow来替换 Repository层中 LiveData使用,主要涉及到 ViewModel层和 Repository层基础类的修改,而修改后的逻辑更加简洁、易读。而且官方文档也有所更新,对 LiveData的使用场景有所限制,见: developer.android.com/topic/libra…:
由于 API设计一致,使用方法与之前没有任何更改,因此可以无缝切换。唯一变更点就是 Repository层的返回数据类型由 LiveData修改为 Flow:
综上,可以在Repository层使用Flow获取数据,并且Retrofit、Room都有自带的Flow扩展支持,使用上基本无缝衔接;ViewModel层collect来自Repository层的Flow,进行数据转换,将Model转到VO,再利用LiveData进行UI更新。
三、安卓开源的android-FlipView,了解的请帮忙
1.ActionBarSherlock
ActionBarSherlock应该算得上是GitHub上最火的Android开源项目了,它是一个独立的库,通过一个API和主题,开发者就可以很方便地使用所有版本的Android动作栏的设计模式。
对于Android
4.0及更高版本,ActionBarSherlock可以自动使用本地ActionBar实现,而对于之前没有ActionBar功能的版本,基于Ice
Cream
Sandwich的自定义动作栏实现将自动围绕布局。能够让开发者轻松开发一款带动作栏(Action
bar)的应用,并且适用于Android 2.x及其以上所有版本。
2.facebook-android-sdk
Facebook SDK for Android是一个开源库,允许开发者将Facebook集成到所开发的Android应用中。
3.SlidingMenu(SlidingMenu
Demos)
SlidingMenu是一个开源的Android库,能够让开发者轻松开发一款应用,实现类似于Google+、Youtube和Facebook应用中非常流行的滑动式菜单。
使用SlidingMenu的Android应用:
Foursquare
Rdio
Plume
VLC for Android
ESPN ScoreCenter
MLS MatchDay
9GAG
Wunderlist 2
The Verge
MTG Familiar
Mantano Reader
Falcon Pro(BETA)
MW3 Barracks
4. cocos2d-x
在移动开发领域,将Cocos2D-X用于主流iOS/Android游戏开发的公司、开发团队多不胜数。cocos2d-x是一个开源的支持多平台的2D游戏框架,使用C++开发,基于cocos2d-iphone,在MIT许可证下发布。主分支在GitHub上使用OpenGL
ES 2.0渲染,而旧版gles11分支则使用OpenGL ES 1.1渲染。
支持iOS、Android、Windows Phone
8、Bada、BlackBerry、Marmalade、Windows、Linux等多个平台。支持C++、Lua、JavaScript编程语言。
5. android
GitHub Android App是GitHub开源的Android客户端,支持Issues、Gists,并集成了新闻Feed,能够让你及时跟进组织及关注的开发者、库等。同时,该应用还提供了一个用户快速访问你所创建、监控及发布issue的面板,可查看并将问题加入到收藏夹,可对标签、里程碑和任务进行过滤配置。
android资源库包含了GitHub Android App的所有源代码。
6.Android-ViewPagerIndicator
ViewPager指针项目,在使用ViewPager的时候能够指示ViewPager所在的位置,就像Google
Play中切换的效果一样,还能使用在应用初始化的介绍页面。
兼容Android支持库的ViewPager及ActionBarSherlock,最初是基于Patrik
Åkerfeldt的ViewFlow。
7. MonoGame
MonoGame是一个Microsoft XNA 4.x
Framework的开源跨平台实现。用于让XNA开发者将他们在Xbox 360、Windows&
Windows Phone上开发的游戏移植到iOS、Android、Mac OS X、Linux及Windows 8
Metro上,目前,PlayStation Mobile& Raspberry PI的开发正在进行中。
8.Android-PullToRefresh
该项目用于为Android提供一个可重用的下拉刷新部件。它最初来源于Johan
Nilsson的库(主要是图形、字符串和动画),但这些后来都已被取代。
9. android-async-http
android-async-http是Android上的一个异步、基于回调的HTTP客户端开发包,建立在Apache的HttpClient库上。
10.Android-Universal-Image-Loader
Android上最让人头疼的莫过于从网络获取图片、显示、回收,任何一个环节有问题都可能直接OOM,这个项目或许能帮到你。
Universal Image Loader for
Android的目的是为了实现异步的网络图片加载、缓存及显示,支持多线程异步加载。它最初来源于Fedor
Vlasov的项目,且自此之后,经过大规模的重构和改进。
11. GreenDroid
GreenDroid最初是由Cyril
Mottier发起,是一个Android的UI开发类库,能够让UI开发更加简便,并且在应用中始终保持一致。
12. Anki-Android
AnkiDroid是一个免费、开源的Android的闪存应用,可直接从Google
Play进行下载。
13.android-actionbar
Action
bar是一个标识应用程序和用户位置的窗口功能,并且给用户提供操作和导航模式。在大多数的情况下,当开发者需要突出展现用户行为或在全局导航的activity中使用action
bar,因为action
bar能够使应用程序给用户提供一致的界面,且系统能够很好地根据不同的屏幕配置来适应操作栏的外观。
Action bar的主要目的:
提供一个用于识别应用程序的标示和用户的位置的专用空间。
在不同的应用程序之间提供一致的导航和视觉体验。
突出Activity的关键操作,并且在可预见的方法内给用户提供快捷的访问。
14.android-viewflow
android-viewflow是Android平台上的一个视图切换的效果库,ViewFlow相当于Android
UI部件提供水平滚动的ViewGroup,使用Adapter进行条目绑定。
15.android-mapviewballoons
当使用Android地图外部库(com.google.android.maps)时,android-mapviewballoons会提供一个简单的方式来对地图覆盖进行标注,就是一个简单的信息气泡。
它由BalloonOverlayView组成,是一个代表显示你的MapView及BalloonIt www.hbbz08.com emizedOverlay的气泡的视图,BalloonItemizedOverlay是ItemizedOverlay的一个抽象扩展。
16.PushSharp
一个向iOS(iPhone/iPad APNS)、Android(C2DM和GCM)、Windows
Phone和Windows 8设备发送推送通知的服务器端库。
17.androidannotations
Android Annotations是一个开源的框架,用于加速
Android应用的开发,可以让你把重点放在功能的实现上,简化了代码,提升了可维护性。
18.HockeyKit
Hockey是一个iOS Ad-Hoc自动更新框架。苹果App
Store中的所有App都可以使用它,它能够显著地提高Beta测试的整个过程,分为两部分:服务器和客户端框架。服务器组件需要所有脚本,但在没有客户端库的情况下,也可以单独工作。它提供一个Web接口,Beta测试者可以使用它来安装最新的AdHoc配置文件,也可以直接在设备上通过Safari安装最新的Beta版本。
只需在服务器上安装一次服务端,就可以处理包标识符不同的多个应用程序(有开发者强烈建议对Debug、AdHoc Beta和AppStore发布版使用不同的包标识符)。
默认当App启动或唤醒时,客户端会从服务器检测更新,用户可以在设置对话框中进行修改:一天一次或手动检查更新。
除了支持iOS,HokeyKit也支持Android平台,不过Android版还处在Alpha阶段,支持OTA及应用内更新。
为HockeyKit用户提供服务器托管服务。
19.android-menudrawer
Android上的菜单展示风格各异,其中用得最多且体验最好的莫过于左右滑动来显示隐藏的菜单,android-menudrawer是一个滑动式菜单实现,允许用户在应用当中实现无缝导航。该项目具有多种菜单展示效果,其中最常见的就是通过屏幕边缘拖动或点击动作栏的“向上”按钮显示。
参考资料:flow-mon