1.什么是Jetpack
Jetpack是一个由多个库组成的套件,可帮助开发者遵循最佳做法,减少样板代码并编写可在各种Android版本和设备中一致运行的代码,让开发者精力集中编写重要的代码。
![](https://img.haomeiwen.com/i5896044/8d5538bd31e5a7a0.png)
2.为何使用Jetpack
- 遵循最佳做法
Android Jetpack组件采用最新的设计方法构建,具有向后兼容性,可以减少崩溃和内存泄露。 - 消除样板代码
Android Jetpack可以管理各种繁琐的Activity (如后台任务、导航和生命周期管理),以便您可以专注于打造出色的应用。 - 减少不一致
这些库可在各种Android 版本和设备中以一致的方式运作,助您降低复杂性。
3.Jetpack与AndroidX
AndroidX命名空间中的包含Android Jetpack库
AndroidX伙替Android Support Library
AAC (Android Architecture Component)中的组件并入AndroidX其他一些需要频繁更新和迭代的特性也被并入了AndroidX
一.LifeCycle
1.LifeCycle的诞生
解耦问题
![](https://img.haomeiwen.com/i5896044/f6146afb31ba2c7d.png)
2.LifeCycle的应用
- 使用Lifecycle解耦页面与组件
![](https://img.haomeiwen.com/i5896044/746f7dcff1ebab7d.png)
![](https://img.haomeiwen.com/i5896044/aaf5a64684af59e6.png)
- 使用LifecycleService解耦Service与组件
-
使用ProcessLifecycleOwner监听应用程序生命周期
image.png
ProcessLifecycleOwner
针对整个应用程序的监听,与Activity数量无关。
Lifecycle.Event.ON_CREATE只会被调用一次, Lifecycle.Event.ON_DESTROY永远不会被调用。
LifeCycle的好处
- 帮助开发者建立可感知生命周期的组件
- 组件在其内部管理自己的生命周期,从而降低模块耦合度
- 降低内存泄漏发生的可能性
- Activity、Fragment、Service、Application均有LifeCycle支持
二.ViewModel
1.ViewModel的诞生
瞬态数据丢失
异步调用的内存泄漏
类膨胀提高维护难度和测试难度
2.ViewModel的作用
它是介于View(视图)和Model(数据模型)之间的桥梁
使视图和数据能够分离,也能保持通信
![](https://img.haomeiwen.com/i5896044/e1431d70b5f44ea4.png)
2.ViewModel的应用
屏幕旋转之后用户操作数据仍然存在
3.ViewModel的声明周期特性
![](https://img.haomeiwen.com/i5896044/4cf5df43a40c4e4e.png)
4.AndroidViewModel
不要向ViewModel中传入Context,会导致内存泄漏
如果要使用Context,请使用AndroidViewModel中的Application
三.LiveData
1.LiveData和ViewModel的关系
在ViewModel中的数据发生变化时通知页面
![](https://img.haomeiwen.com/i5896044/b41564c8c0c0ec77.png)
2.LiveData应用
ViewModel+LiveData实现Fragment间通信
3.LiveData的优势
- 确保界面符合数据状态
- 不会发生内存泄漏
- 不会因Activity停止而导致崩溃
- 不再需要手动处理生命周期
- 数据始终保持最新状态
- 适当的配置更改
- 共享资源
四.DataBinding
1.DataBinding的意义
让布局文件承担了部分原本属于页面的工作,使页面与布局耦合度进一步降低
2.ActivityMainBinding由来
![](https://img.haomeiwen.com/i5896044/44d60484e3244be7.png)
![](https://img.haomeiwen.com/i5896044/3737e48d94a697d4.png)
![](https://img.haomeiwen.com/i5896044/09a334f5eff0adc1.png)
![](https://img.haomeiwen.com/i5896044/7b93b6ca018fbb45.png)
![](https://img.haomeiwen.com/i5896044/c3d2f10e56e0d581.png)
3.二级页面的绑定
<include>标签引用二级页面
![](https://img.haomeiwen.com/i5896044/bafa31aac4bb57e4.png)
![](https://img.haomeiwen.com/i5896044/692419d0060e5f22.png)
4.自定义BindingAdapter
加载网络图片
方法重载,加载本地图片
多参数重载
![](https://img.haomeiwen.com/i5896044/96351d3b222fbf73.png)
![](https://img.haomeiwen.com/i5896044/679b678e3cc60f15.png)
5.双向绑定
BaseObservable与ObservableField
![](https://img.haomeiwen.com/i5896044/e2bcefdb755f4852.png)
-
BaseObservable
EditText的内容发生改变,会自动调用setUserName方法
image.png
image.png
-
ObservableField
image.png
6.RecyclerView的绑定
RecyclerViewAdapter
onCreateViewHolder()
image.png
onBindViewHolder()
image.png
MyViewHolder
image.png
item.xml
设置图片
image.png
image.png
image.png
7.DataBinding+ViewModel+LiveData
篮球比赛记分牌
![](https://img.haomeiwen.com/i5896044/22ddf891ac30df68.png)
activity_main.xml点击事件
image.png
8.DataBinding的优势
不再需要findViewByld,项目更加简洁,可读性更高
布局文件可以包含简单的业务逻辑。
![](https://img.haomeiwen.com/i5896044/a101ba88c7a1e3a4.png)
五.Room
1.Android官方ORM库Room
Android采用SQLite作为数据库存储,开源社区常见的ORM (Object Relational Mapping)库有ORMLite、GreenDAO等。Room和其他库一样,也是在SQLite上提供了一层封装。
![](https://img.haomeiwen.com/i5896044/902089971100ced0.png)
2.Room重要概念
- Entity:实体类,对应的是数据库的一张表结构,使用注解@Entity标记
- Dao:包含访问一系列访问数据库的方法,使用注解@Dao标记。
-
Database:数据库持有者,作为与应用持久化相关数据的底层连接的主要接入点。使用注解@Database标记,另外需满足以下条件:定义的类必须是一个继承于RoomDatabase的抽象类,在注解中需要定义与数据库相关联的实体类列表。包含一个没有参数的抽象方法并且返回一个Dao对象。
image.png
3.Room应用
学生信息的CRUD
![](https://img.haomeiwen.com/i5896044/7b7c84e539bc8d3a.png)
gradle依赖
image.png
定义Entity
image.png
Room只需要一个构造方法, 如果需要其他构造方法,使用@Ignore注解
image.png
定义Dao
image.png
MyDatabase不能私有化构造方法,必须abstract抽象类,Room会去实例化MyDatabase
image.png
进一步优化:
问题:每当数据库数据发生变化时,都需要开启一个工作线程去重新获取数据库中的数据。
解决:当数据发生变化时,通过LiveData通知View层,实现数据自动更新。
4.Room+ViewModel+LiveData
![](https://img.haomeiwen.com/i5896044/dd0016315297b1b9.png)
5.使用Migration升级数据库
问题:如果用户设备上数据库版本为1,而当前要安装的App数据库版本为3,怎么办?
Room会先判断当前有没有直接从1到3的升级方案,如果有,就直接执行从1到3的升级方案,如果没有,那么Room会按照顺序先后执行Migration(1,2)、Migration(2,3)以完成升级。
定义Migration
image.png
addMigrations()
image.png
6.异常处理
假设我们将数据库版本升级到4,却没有为此写相应的Migration,则会出现一个llegalStateException异常,加入fallbackToDestructiveMigration(),该方法在出现升级异常时,重建数据表,同时数据也会丢失。
![](https://img.haomeiwen.com/i5896044/a105a2506d1c0cd8.png)
网友评论