Android-网络请求与数据存储|青训营笔记
这是我参加「第四届青训营」笔记创作活动第三天
网络通信
App内容的获取,都是通过网络请求作为app的基础能力
- 网络库开源框架对比
- Retrofit
Retrofit是目前Android平台上,可以说是最热门的网络请求封装框架,是对OKHttp的一个封装
- Retrofit库的引入
- 创建用于描述网络请求的接口
- 使用Retrofit实例发起网络请求
使用介绍
1.在需要用到Retrofit接口的module中,新增依赖
2.创建用描述网络请求的接口
定义说明
- 接口类名:可自定义,尽量和这类请求的含义相关
- 函数名:可自定义,需要能识别出该类接口的作用,该类接口里可以增加多个不同的函数
- @get注解:用于指定该接口的相对路径,并采用get方法发起请求
- @path注解:需要外部调用时,传入一个uid,该uid会替换@get注解里相对路径{uid}
- 返回值:这里用ResponseBody,我们以直接拿到请求String内容如果要自动转为Model类,例如User,这里直接替换为User就好
3.发起网络请求
- 创建Retrofit实例
- 创建请求接口的实例,并获取call实例
- 调用call.enqueue进行异步请求
- 处理返回数据 注解类型:
3. TTNET介绍
网络请求框架 有以下几点:
- 基于Retrofit改造,具备了Retrofit所具有的优点
- 支持多个Http网络库的动态切换(okHttp和cronet)
- 支持网络拦截配置:添加公共参数,动态切换协议及Host动态路径等
注解介绍
有定义和使用注解的地方,肯定还需要有获取注解并处理注解内容的地方 注解的处理,一般有3个时机(也就是注解的生命周期@retention)
- SOUREC:只有在源代码中有效,编译时抛弃
- CLASS:编译class文件时有效,一般会使用到注解处理器
- RUNTIME:在运行期间,获取对应的注解,并做相关的处理
Retorfit注解@get定义
@Target:指定作用对象,这里是METHOD说明这个注解是作用在方法上 其他枚举值:
- PARANETER:参数
- FIELD:类成员
@RETENTION:指定注解生命周期,这里是RUNTINE,说明要这个注解要一直保持到运行时 注解是获取和使用
通过反射获取到Method对象后,有以下一些接口来获取注解内容
- Method.getgebericreturmType()获取返回类型
- Method.getAnnotation()获取方法的注解
- Method.getParameterAnnotation()获取参数注解 Retrofit是运行期间,配合java动态代理,获取方法参数的注解,并构造Request对象
Retrofit主流程
- 通过Builder模式,创建RetorfitConfig保存baseUrl等内容
- 创建动态管理对象
- 创建okhttpcall
- 发起网络请求
Retrofit调用okhttp
TTNet类图设计
核心功能要是替换其中2点
- 替换底层用到的okhttpclient
- 替换底层用到的okhttpcall
总结
数据存储
数据存储方式对比
- 持久性的本地数据存储是Android中常见的能力,可以在应用被杀死的情况下,而保持数据不会被清除。我们可以根据不同场景的诉求,可以选用不同的存储方式,常见的数据存储主要有以下4种
数据库框架对比
数据库 相对来说,数据库的使用会比较复杂,以下是主流数据库框架的对比
Room数据库使用介绍
- Room是Qoogle Jeptpack 家族里的一员,Room在SQLite上提供了一个抽象层,以便在充分利用SQLite的强大功能的同时,能流畅的访问数据库
主要的三个组件
- 数据库类,用于保存数据库并作为应用持久数据底层连接的主要访问点
- 数据库实体,用于表示应用的数据库中的表
- 数据库访问对象,提供您的应用可用于查询、更新、插入和删除数据库中的数据库的方法
Room数据库原理介绍
核心
编译期,通过kapt处理@Dao、@database注解,动态生成对应的实现类 底层使用Android提供的SupportSQLiteOpenHelper实现数据库的增删改查等操作
kapt注解处理
Room在编译期,通过kapt处理@Dao和@Database注解,生成DAO和Database的实现类
AppDatabase_impl:数据库实例的具体体现,自动生成,主要有以下几个方法
- createOPenHelper():ROOm.databaseBuilder().build()创建Database时,会调用实现类的
- createOpenHelper()创建SupportSQLiteOpenHelper,此Helper用来创建DB以及管理版本
- userDao():创建UserDao_lmpl
AppDatabase_impl的两个具体实现:
- createOpenHelper()
- userDao()
UserDao_lmp:UserDao的具体实现,自动生成,主要有以下3给成员变量以及UserDao里定义的接口
- 3核心的成员变量:
- _ _db:ROOmDatabase的实例
- _ _inaertionAdaoter:EntitylnsertionAdapterd实例
- _ _deletionAdapterOfUser:EntityDeletionOrUpdateAdapteer实列用于数据的update/delete
n个是UserDao里我们自己定义的接口的具体实现:
- insertAll()
- delete()
- getAll()
- loadAllBylds()
- findByNames()
UserDao_imp#insertAll():
使用__db开启事务,
使用__insertonAdapterofUser执行插入操作
UserDao_imp#delete():
使用__db开启事务,
使用__insertonAdapterofUser执行删除操作
- UserDao_imp#getAll():
- 自动生成sql语句
- 获取数据库的Cursor光标
- 使用Cursor循环读取数据库的每条记录