Android jetpack最佳总结和实践(1)

(5)用户偏好设置和网络请求数据的本地存储问题。

针对以上问题,Google推出Android Jetpack框架来解决以上问题。Jetpack主要分为4个部分(下图): 基础、架构、行为、界面 。

同时Google也推出 AndroidX 库,AndroidX 是对support library的重大改进。在AndroidX中将所有软件包名都以字符串**androidx.**开头,位于一致的命名空间中。

使用Android Jetpack组件的优势:

(1)Lifecycles轻松管理应用程序的生命周期。

(2)LiveData构建可观察的数据对象,以便在基础数据更改时通知视图。

(3)ViewModel存储在应用程序轮换中未销毁的UI相关数据,在界面重建后恢复数据。

(4)Room轻松的实现SQLite数据库。

(5)WorkManager系统自动调度后台任务的执行,优化使用性能。

(6)Navigation导航组件轻松管理Fragment等页面跳转问题。

google推荐的基于Jetpack的Android客户端软件开发架构图:

(1)通过定义Repository管理数据来源(Model)。

(2)使用LiveData驱动界面(View)更新。

(3)使用ViewModel代替Presenter管理数据(VM)。

(4)Room(Sqlite)储存本地序列化的数据,Retrofit获取远程数据的数据。

关于该架构的疑问:该模式的是MVP还是MVVM架构?

与传统的MVP架构相比有以下优点:

(1)在MVP架构中,Presenter中持有View层的引用,如果生命周期处理不当,会存在内存泄露的风险。在MVVM架构中View层和VM层通过LiveData通信,避免了内存泄漏。。

(2)传统MVP架构由于各层之间的通信是通过接口,所以会导致接口数量惊人,上诉架构通过观察者模式(LiveData)避免了接口问题。

如果在上诉架构中加入Databidning。实现View和Model的双向绑定接可以演变成MVVM架构。但是基于DataBinding的MVVM架构有如下缺点:

(1)数据双向绑定,导致View不可重用。

(2)通过DataBinding实现数据绑定,会增加Bug调试难度。

(3)业务的复杂,会带来View页面复杂,model层代码也会增大。

jetpack架构


2.1 Lifecycles

  1. 一句话概述: Lifecycles是一个持有组件生命周期状态(Activity、Fragment)信息的类,用来解决生命周期管理问题的组件。

  2. 生命周期转化图:

  1. 实现原理

(1)数据结构: 为什么使用该数据结构? 具有如下优点:

1.SafeIterableMap 的插入操作是时间复杂度O(1)直接通过指针的移动插入数据,而且不需要执行hash算法,效率高。

2.遍历的过程中删除元素而不触发ConcurrentModifiedException。

3.使用双向链表来存储会比 HashMap (java 8 红黑树)节省内存空间。

2)类图

  1. Lifecycle组件成员Lifecycle被定义成了抽象类,LifecycleOwner、LifecycleObserver被定义成了接口。

  2. 组件(Activity、Fragment)实现了LifecycleOwner接口,该只有一个返回Lifecycle对象的方getLifecyle(): LifecycleRegistry。

  3. Lifecycle的内部类State标明状态、Event表示事件

  4. ObserverWithState的成员变量GenericLifecycleObserver继承自LifecycleObserver

2.2 ViewModel

  1. 一句话概述: ViewModel存储和管理 UI 相关数据,保证组件(Activity)重新创建时可以恢复历史数据。

  2. 生命周期转化图:

  1. 实现原理

(1)onRetainNonConfigurationInstance方法。 当发生屏幕切换时,将伴随Destroying被系统调用。通过这个方法可以像onSaveInstanceState()的方法一样保留变化前的Activity数据和状态,最大的不同在于这个方法可以返回一个包含有状态信息的Object对象,其中甚至可以包含Activity Instance本身。用这个方法保存Activity State后。

(2)通过getLastNonConfigurationInstance()在新的Activity Instance中恢复原有状态。比如: 在恢复窗口时,我们可以不使用onRestoreInstanceState,而代替的是 getLastNonConfigurationInstance 方法。

2.3 LiveData

  1. 一句话概述: LiveData 是保存数据对象的类,通过注册监听器Observer 监听数据的变化。LiveData最大的优势:LiveData 是感知Activity、Fragment等生命周期的组件。

  2. 实现原理

(1)使用LifecycleOwner的observe() 方法将观察者对象附加到LiveData对象,将观察者向LiveData对象订阅,以便通知LiveData中数据的变化。

(2)当Lifecycle 没有处于活动状态( (STARTED 、RESUMED)),Observer 则不会被通知,即使数据发生了变化,没有处于活动状态的 Observer 也不会被通知。

(3)Lifecycle 被销毁(destroyed)Observer 也自动被删除,无需用户手动清理。 避免内存泄漏:Observer 和 Lifecycle 绑定,可以感知组件生命周期,所以当 Lifecycle 被销毁后,Observer 自动被remove避免内粗泄漏。

2.4 WorkManager

  1. 一句话概述: WorkManager 负责用来管理后台任务,它适用于需要保证系统即使应用程序退出也会运行的任务, WorkManager会根据设备API级别和应用程序状态等因素选择适当的方式来运行任务。

  2. 实现原理 架构图:

2.5 Navigation

  1. 一句话概述: Navigation管理APP页面跳转。Navigation大部分部分情况下作用于Fragment中,使用Navigation切换Fragment可以使代码简洁,直观。Navigation导航组件还支持:Fragment、Activity、导航图和子图、自定义目标等。。

  2. 实现原理 类图:

2.6 Paging&Room

  1. 一句话概述: Paging主要是用来结合RecyclerView进行使用,是一种分页加载解决方案,这样Paging每次只会加载总数据的一部分。 Room是Google提供的一个ORM库。。

  2. 实现原理 原理图:

示例


基于Jetpack的架构图总结:

架构图:

(1)View层:表示的Activity和Fragment等组件。

(2)ViewModel层:ViewModel存储和View层相关的数据,可以在View层重新绘制时恢复数据,而且负责和View层和仓库层之间的通信。

(3)仓库层:负责从数据库中获取数据或者从网络中获取数据,并将数据返回给ViewModel层。

(4)数据层:数据层分为网络数据层(Retrofit)和是数据库数据层(GreenDao)。

(5)View层和ViewModel层通过LiveData通信,避免了接口的内存泄漏问题。 关于仓库层存在必要性?:

大致意识:

仓库模块负责处理数据操作,提供了一个干净的API使得获取数据更加容易。仓库层知道从何处获取数据以及更新数据时要调用的API。你可以认为仓库层是作为中介在不通过的数据源之间,比如持久模型,Web服务,缓存等。

总结:遵循关注点分离原则 经过Repository中介层使得ViewModel不需要具体的数据来源,这样就可以根据需求将其交换为其他实现。

如果你想学习jetpack但是又缺少总结性的学习资料,我正好薅到这本阿里十年技术专家联合打造“最新”《Jetpack强化实战手册》,是你学习Jetpack的葵花宝典。下面正文开始:

一、初识ConstraintLayout之实现登录页面


1.创建项目

2.沉浸式的布局

3.富文本

4.属性动画

二、Navigation实践之实现APP主框架以及Navigation的相关介绍


1.搭建 Bottom Navigation Activity

2.导航界面跳转

3.Navigation传值

4.Navigation跳转动画

5.导航文件拆分

6.Deeplink导航

三、使用 Coroutines, Retrofit, Moshi实现网络数据请求


1.kotlin - Coroutine 协程

2.用协程和Retrofit实现网络请求

四、使用 TabLayout,ViewPager2 ,RecyclerView实现实现歌单广场页面


1.ViewPager2

2.TabLayout

3.RecyclerView

4.网络数据请求和数据填充

5.优化界面

五、歌单页面MVVM架构改造及其ViewModel和LiveData的使用介绍


1.MVC和MVVM介绍

2.修改歌单页面

六、Paging实现加载更多和下拉刷新,错误后重新请求



1.Paging的优势

2.Paging实现分页加载更多

3.Paging和SwipRefreshLayout组合实现下拉刷新

4.给RecyclerView添加加载状态的Footer

5.发生网络错误后重试

6.帧动画

七、vlayout嵌套横向RecyclerView和Banner 实现主页的展示,自定义Moshi的JsonAdapter

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值