当前位置:网站首页>Jetpack中各个组件简介
Jetpack中各个组件简介
2022-08-02 03:27:00 【浮空over】
文章目录
前言
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,要求实现NavHostNavController
:在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的一个扩展
边栏推荐
猜你喜欢
树莓派4b安装win11/10过程全教程(附蓝屏inaccessible boot device解决办法)
ES6 array extension methods map, filter, reduce, fill and array traversal for…in for…of arr.forEach
Dcat Admin 关闭代码生成器 登录指定地址
C language uses stack to calculate infix expressions
公司产品太多了,怎么实现一次登录产品互通?
laravel 写api接口时 session获取不到处理办法
ES6 iterator explanation example
元宇宙:为何互联网大佬纷纷涉足?元宇宙跟NFT是什么关系?
文件上传漏洞
hackmyvm: may walkthrough
随机推荐
The learning path of a network security mouse - the basic use of nmap
一分钟get:缓存穿透、缓存击穿、缓存雪崩
Smart Tips for Frida Scripting in Kali Environment
聊聊MySQL的10大经典错误
hackmyvm-bunny预排
Kotlin - 延迟初始化和密封类
成本会计的概念、产品成本核算的要求、产品成本核算的对象与成本项目、产品成本的归集和分配(可能考判断)、产品成本计算方法 (三种:产品的品种(品种法),批次(分批法),步骤(分步法))
链动2+1无限循环系统,2022年起盘成功率超高的模式
Scrapy crawler encounters redirection 301/302 problem solution
借贷记账法下的账户结构、借贷记账法的记账规则、借贷记账法下的账户对应关系与会计分录
Larave 自定义公共函数以及引入使用
命令执行漏洞
The roll call system and array elements find maximum and minimum values for sorting of objects
还原最真实、最全面的一线大厂面试题
By figure, a (complete code at the end)
ES6 iterator explanation example
加密数字货币前传:从大卫·乔姆到中本聪
【一句话攻略】彻底理解JS中的回调(Callback)函数
xxe of CTF
PHP hash加密与解密