文章目录
前言
Jetpack是当下最火的组件了,Google官方大力推荐,其好用,性能优异受到很多开发者的喜爱,接下来我们将简单了解一下Jetpack中各个组件,以后会发文章单独详细讲解
一、Lifecycle
lifecycle通过观察者模式监听生命周期
被观察者(lifecycleOwner):activity,Fragment声明周期变化getLifecycle().addObversever(自己的类)绑定观察者—>通知 dispatch(Event)—>观察者(lifecycleObserver):用户类,FrameWork层类,mObserverMap:存放了所有观察者—>反射拿到观察者的class对象—>mInfo:存放了所有带注解的方法@OnLifecycleEvent(Lifecycle.Event.ON_CREATE))—> mMethod.invoke(target,source)—>调用相应api,需要监听哪个声明周期则重写哪个方法就好
- mState:从左往右,从右往左返回状态值
- 监听生命周期需要实现lifecycleObserver接口
二、liveData
-
liveData是一个数据持有类
-
能够感知组件的生命周期,确保仅更新活跃组件
-
不会因Activity停止而导致崩溃,如果观察者的生命周期处于非活跃状态(如返回栈中的 Activity),则它不会接收任何 LiveData 事件
-
持有的数据可被观察者观察,在底层数据更改时通知视图
-
一对多观察者:观察者会绑定lifecycle对象,在生命周期结束时会自我清理(不会发生内存泄露)
-
共享资源:可以使用单例模式扩展 LiveData 对象以封装系统服务,以便在应用中共享它们。
-
liveData使用:
-
MutableLiveData:LiveData(抽象类)的子类
-
liveData.postValue():可在任意线程下执行(切换线程操作)
-
liveData.setValue():只能在主线程中执行
-
liveData.observe():注册观察者
-
-
observe()源码:注册观察者保存在mObserves(map)中
感知生命周期:owner.getLifecycle().addObserver(wapper),改变时调用onstatechanged()
观察者有两种情况会被回调:
1、postValue时会遍历观察者然后回调
2、当组件生命周期发生变化或者第一次注册观察者时回调
-
粘性事件:
这里得满足两个条件会触发粘性事件
1.数据发送早于注册监听
2.监听者的owner生命周期进入活跃状态
三、ViewModel和DataBinding
-
viewModel:注重以生命周期的方式存储和管理界面相关数据,不受activity生命周期影响
-
数据持久化:生命周期不受限制
-
异步回调问题不会造成内存泄露
-
隔离model层和view层:解耦
-
Fragment间共享数据
-
-
DataBinding:实现双向绑定,数据和UI同步
作用:当数据源发生改变时,及时更新给UI(p层做的事情交给系统源码去做)
四、Navigation和Fragment
-
Navigation:导航(回退栈)
-
三大件:
-
Navigation Graph
:导航图,包含了所有导航相关信息的XML资源。一般防止在res/navigation目录下 -
NavHost
:容器,用来显示Fragment的,即Activity中的fragment,要求实现NavHost -
NavController
:在NavHost中管理应用导航的对象
一句话就是,通过NavController,获取当行图中的特定路径以及目标,导航到特定的目标放到NavHost中
Navigation
是用来管理Fragment
的切换,并且可以通过可视化的方式,看见APP
的交互流程。 -
-
优势:
1、可视化的页面导航图,可以编辑各个组件之间的跳转关系
2、优雅的支持Fragment之间的转场动画
3、通过第三方的插件(SafeArgs(Gradle插件))支持Fragment之间类型安全的参数传递
4、通过NavigationUI类,对菜单,底部导航,抽屉菜单导航进行方便统一的管理
5、支持通过deeplink直接定位到Fragment
五、Room数据库
-
轻量级orm数据库(关系映射型),本质上sqlite抽象层,类似于Retrofit库,Room在开发阶段通过注解标记相关功能,编译时自动生成impl实现类
-
数据库框架的两种实现思路:
-
关系映射型(orm):根据类对象通过反射的手段获取到类名以及成员变量名作为表名和字段名
缺点:无法确定类对象中有哪些成员不需要创建表字段
-
注解+反射:每个业务模块完全独立,不浪费资源,要自定义注解和处理注解
-
-
Room三大件:
1、Entity:实体类,对应的是数据库的一张表结构。需要使用注解 @Entity 标记。
2、Dao:包含访问一系列访问数据库的方法。需要使用注解 @Dao 标记。
3、Database:数据库持有者,作为与应用持久化相关数据的底层连接的主要接入点。需要使用注解 @Database 标记。
使用@Database注解需满足以下条件:
1)定义的类必须是一个继承于RoomDatabase的抽象类。
2)在注解中需要定义与数据库相关联的实体类列表。
3)包含一个没有参数的抽象方法并且返回一个带有注解的 @Dao。
六、workManager
-
workManager:可延迟运行,并在应用退出或重启时能可靠运行任务
应用场景:埋点上传,非即时性上传与下载,同步数据和处理数据
-
三大件:
1、Worker:我们要执行的具体任务。需要继承Worker,重写doWork方法,然后在里面写具体的逻辑。
2、WorkRequest:上面的Worker是定义了我们要在后台的任务,而这个类是对Worker的包装。
下面两个都是继承了WorkRequest:
OneTimeWorkRequest: 只执行一次的任务
PeriodicWorkRequest: 重复执行的任务(重复间隔大于15分钟)
3、WorkManager:是对WorkRequest的管理类。
七、pager
-
pager:分页加载
-
三大件:
-
DataSource:数据源,获取数据
-
pagedList:承载数据,可理解为一页数据的集合
-
pagedListAdapter:对RecyclerViewAdapter的一个扩展
-