Jetpack

作者: android小菜鸡一枚 | 来源:发表于2023-08-18 21:01 被阅读0次
1.什么是Jetpack

Jetpack是一个由多个库组成的套件,可帮助开发者遵循最佳做法,减少样板代码并编写可在各种Android版本和设备中一致运行的代码,让开发者精力集中编写重要的代码。


image.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的诞生

解耦问题


image.png
2.LifeCycle的应用
  • 使用Lifecycle解耦页面与组件
image.png
image.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(数据模型)之间的桥梁
使视图和数据能够分离,也能保持通信


image.png
2.ViewModel的应用

屏幕旋转之后用户操作数据仍然存在

3.ViewModel的声明周期特性
image.png
4.AndroidViewModel

不要向ViewModel中传入Context,会导致内存泄漏
如果要使用Context,请使用AndroidViewModel中的Application

三.LiveData

1.LiveData和ViewModel的关系

在ViewModel中的数据发生变化时通知页面


image.png
2.LiveData应用

ViewModel+LiveData实现Fragment间通信

3.LiveData的优势
  • 确保界面符合数据状态
  • 不会发生内存泄漏
  • 不会因Activity停止而导致崩溃
  • 不再需要手动处理生命周期
  • 数据始终保持最新状态
  • 适当的配置更改
  • 共享资源

四.DataBinding

1.DataBinding的意义

让布局文件承担了部分原本属于页面的工作,使页面与布局耦合度进一步降低

2.ActivityMainBinding由来
image.png
image.png
image.png
image.png
image.png
3.二级页面的绑定

<include>标签引用二级页面


image.png
image.png
4.自定义BindingAdapter

加载网络图片
方法重载,加载本地图片
多参数重载


image.png
image.png
5.双向绑定

BaseObservable与ObservableField


image.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

篮球比赛记分牌


image.png
  • activity_main.xml点击事件


    image.png
8.DataBinding的优势

不再需要findViewByld,项目更加简洁,可读性更高
布局文件可以包含简单的业务逻辑。


image.png

五.Room

1.Android官方ORM库Room

Android采用SQLite作为数据库存储,开源社区常见的ORM (Object Relational Mapping)库有ORMLite、GreenDAO等。Room和其他库一样,也是在SQLite上提供了一层封装。


image.png
2.Room重要概念
  • Entity:实体类,对应的是数据库的一张表结构,使用注解@Entity标记
  • Dao:包含访问一系列访问数据库的方法,使用注解@Dao标记。
  • Database:数据库持有者,作为与应用持久化相关数据的底层连接的主要接入点。使用注解@Database标记,另外需满足以下条件:定义的类必须是一个继承于RoomDatabase的抽象类,在注解中需要定义与数据库相关联的实体类列表。包含一个没有参数的抽象方法并且返回一个Dao对象。


    image.png
3.Room应用

学生信息的CRUD


image.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
image.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(),该方法在出现升级异常时,重建数据表,同时数据也会丢失。


image.png

相关文章

网友评论

      本文标题:Jetpack

      本文链接:https://www.haomeiwen.com/subject/lkntmdtx.html