当前位置:网站首页>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的一个扩展
边栏推荐
猜你喜欢
v-bind usage: class dynamic binding object array style style and function method
Google Hacking
【泰山众筹】模式为什么一直都这么火热?是有原因的
借贷记账法下的账户结构、借贷记账法的记账规则、借贷记账法下的账户对应关系与会计分录
会计凭证概述、原始凭证、原始凭证的种类、原始凭证的基本内容、原始凭证的填制要求、原始凭证的审核
xxe of CTF
清理c盘爆满告急,C盘清理
云安全笔记:云原生全链路加密
账务处理程序、记账凭证账务处理程序、汇总记账凭证账务处理程序、科目汇总表账务处理程序、会计信息化概述、信息化环境下会计账务处理的基本要求(此章出1道小题)
一个网络安全小白鼠的学习之路—nmap高级用法之脚本使用
随机推荐
laravel-admin 列表图片点击放大
Scrapy crawler encounters redirection 301/302 problem solution
laravel-admin FROM表单同行展示问题
2021-09-04 最简单的Golang定时器应用以及最简单的协程入门儿
真·杂项:资本论阅读笔记(随缘更新)
(3) string
hackmyvm: may walkthrough
file contains vulnerabilities
敏感信息泄露
超级云APP,陪伴您一起成长的软件
管理会计(对内)指引、管理会计要素及其具体内容(可能考,考前记一下,推荐记一下四个大点即可)、
库存现金、现金管理制度、现金的账务处理、银行存款、银行存款的账务处理、银行存款的核对
ES6 three-dot operator, array method, string extension method
hackmyvm: juggling walkthrough
laravel 写api接口时 session获取不到处理办法
记账凭证的种类、记账凭证的基本内容、记账凭证的填制要求、记账凭证的审核
How to determine the direction based on two coordinate points on the map
Eric target penetration test complete tutorial
(5) Modules and packages, encoding formats, file operations, directory operations
Laravel 登录,中间件和路由分组