这是我参与「第四届青训营 」笔记创作活动的第8天。
网络通信
- 网络库架构对比
- Retroofit使用&原理介绍
- 字节跳动网络请求框架TTNet介绍
数据存储
- 安卓数据存储方式,分场景
- 数据库框架对比
- Room数据库使用与原理介绍
Android注解
注解的处理,有三个时机:
- SOURCE:只有在源码中有效,编译时抛弃,eg.@Override
- CLASS:编译class文件时有效,一般会使用到注解处理器
- RUNTIME:在运行期间,获取对应注解,并做好相应的处理
网络请求
- 客户端向服务端发起请求,服务端返回数据给客户端
- 为了更多的更迭,一般会进行网络请求的封装
网络框架
- OkHttp与Retrofit组合方式进行网络请求,功能更加全面,封装更加彻底。
- IO与NIO
- 阻塞式IO 程序一直等,数据读完后才能继续操作。
- 非阻塞式NIO,当读到一个地方不能读时,该地方继续读,程序接着往下执行;等数据处理完后再通知我,再处理回调。
- Okio是Square公司基于IO和NIO基础上做的一个更简单、更高效处理数据流的一个库。
Retrofit
是对OkHttp的一个封装,也是当下流行的一种网络请求方式。
当想要查询一个数据时,用户端发送一个字段给服务端,服务端通过该字段进行查找,并返回用户端需要的相关信息。
# uid为实际uid的位置
https://www/bytedance.com/users/{uid}/name
使用
- 添加Retrofit库的依赖
- 创建用于描述网络请求的接口
- 发起网络请求
TTNet
字节跳动通用的网络请求封装架构,用来向服务端发起请求。
基于Retrofit二次开发,替换Retrofit核心两点:
- 替换底层要用的OkHttpClient
- 替换底层要用的OkHttpCall
优势:
- 基于Retrofit改造,具备了Retrofit的优化
- 支持多个Http网络库的动态切换(okhttp和cronet)
为什么Retrofit只支持OkHttp网络库?
答:在通过代理对象对方法接口进行调用时,会在InvocationHandler#invoke方法回调里为serviceMethod.callAdapter.adapt()设置OkHttpCall对象,进而发起请求时,委托OkHttpCall对象发起网络请求。而OkHttpCall#enqueue调用okHttp网络库发起请求。
所以serviceMethod.callAdapter.adapt()设置死了okHttpCall对象。Retrofit发起请求只能对OkHttp网络支持了
数据存储
常见数据存储方式:
- SharedPreferences:键值对,(可以支持多进程,但使用要格外小心)
- 文件存储:二进制格式文件
- ContentProvider:跨进程、跨APP共享数据
- SQLite存储数据:复杂对象存储;需要对数据进行增删改查
主流的数据库架构:
- Room
- GreenDao
- ObjectBox
Room数据库
Client => Root => SupportSQLiteOpenHelper
主要的3个组件:
- 数据库类(Database):用于保存数据库并作为应用持久性数据底层连接的主要访问点。
- 数据实体(Entity):用于表示应用的数据库中的表
- 数据访问对象(DAO):提供应用中 可用于查询、更新、插入和删除数据库中的数据的方法。
Room相关设计
- build.gradle文件添加如下:
dependencies{
def room_version = "2.4.2"
implementation "androidx.room:room-runtime:$room_version"
Kapt "androidx.room:room-compiler:$room_version"
//其他依赖
- 定义User数据实体(Kolin?)
ps: 所有属性必须都是public、或者有get、set方法。
@PrimaryKey 表示单个主键,当主键为null且auto
Generate为true可以帮助自动生成键值
@ColumnInfo 列名的注解
- 新增DAO
- 新建数据库类
- 新建一个RoomDatabase的abstract子类
- 子类加注解
@Database(entities = [xxx], version = n),entities包含数据实体,他将会在这个数据库中创建对应表,version是数据的版本号。
- 获取dao对象
Room简单实用
- 工程导入
- 数据表设计
- 新增Entity数据实例——用于定义表名和列名
- 新增DAO接口——定义需要用到的数据库操作方法
- 新增RoomDatabase抽象子类——定义数据库的版本等
- 获取db和AO对象——调用dao接口进行增删改查操作
Room原理介绍
- 编译期,通过kapt处理
@Dao、@Database注解,动态生成对应的实现类;kapt生成代码在build/generated/source/kapt/
- AppDatabase => AppDatabase_Impl
- UserDao =>UserDao_Impl
- 底层使用Android提供的
SupportSQLiteOpenHelper实现数据库的增删改查等操作
总结
- 信息流的数据要能够无限刷新
- 实用网络请求,实时从服务端获取数据
- 可以按需选择合适的网络框架,也可以自己做个二次封装
- 每次冷启,能快速展现信息流内容
- 实用数据库存储,将数据存储在本地
- 冷启时直接从数据库读取,直接进行数据解析和展示
Q & A
rxjava具有一些不错的特性
Room是对SQLite的封装,它的底层是由SQLite实现的:数据需要增删改查就存储在SQLite里,如果不需要可以不用。客户端数据存储较小,SQLite合适。移动端数据量很大