数据存储 & 网络通信 | 青训营笔记

107 阅读4分钟

这是我参与「第四届青训营 」笔记创作活动的第8天。

网络通信

  1. 网络库架构对比
  2. Retroofit使用&原理介绍
  3. 字节跳动网络请求框架TTNet介绍

数据存储

  1. 安卓数据存储方式,分场景
  2. 数据库框架对比
  3. Room数据库使用与原理介绍

Android注解

注解的处理,有三个时机:

  1. SOURCE:只有在源码中有效,编译时抛弃,eg.@Override
  2. CLASS:编译class文件时有效,一般会使用到注解处理器
  3. RUNTIME:在运行期间,获取对应注解,并做好相应的处理

网络请求

  1. 客户端向服务端发起请求,服务端返回数据给客户端
  2. 为了更多的更迭,一般会进行网络请求的封装

网络框架

  1. OkHttp与Retrofit组合方式进行网络请求,功能更加全面,封装更加彻底。
  2. IO与NIO
    • 阻塞式IO 程序一直等,数据读完后才能继续操作。
    • 非阻塞式NIO,当读到一个地方不能读时,该地方继续读,程序接着往下执行;等数据处理完后再通知我,再处理回调。
    • Okio是Square公司基于IO和NIO基础上做的一个更简单、更高效处理数据流的一个库。

Retrofit

是对OkHttp的一个封装,也是当下流行的一种网络请求方式。

当想要查询一个数据时,用户端发送一个字段给服务端,服务端通过该字段进行查找,并返回用户端需要的相关信息。

# uid为实际uid的位置
https://www/bytedance.com/users/{uid}/name

使用

  1. 添加Retrofit库的依赖
  2. 创建用于描述网络请求的接口
  3. 发起网络请求

TTNet

字节跳动通用的网络请求封装架构,用来向服务端发起请求。

基于Retrofit二次开发,替换Retrofit核心两点:

  1. 替换底层要用的OkHttpClient
  2. 替换底层要用的OkHttpCall

优势:

  • 基于Retrofit改造,具备了Retrofit的优化
  • 支持多个Http网络库的动态切换(okhttp和cronet)

为什么Retrofit只支持OkHttp网络库?

答:在通过代理对象对方法接口进行调用时,会在InvocationHandler#invoke方法回调里为serviceMethod.callAdapter.adapt()设置OkHttpCall对象,进而发起请求时,委托OkHttpCall对象发起网络请求。而OkHttpCall#enqueue调用okHttp网络库发起请求。 所以serviceMethod.callAdapter.adapt()设置死了okHttpCall对象。Retrofit发起请求只能对OkHttp网络支持了

数据存储

常见数据存储方式:

  1. SharedPreferences:键值对,(可以支持多进程,但使用要格外小心)
  2. 文件存储:二进制格式文件
  3. ContentProvider:跨进程、跨APP共享数据
  4. SQLite存储数据:复杂对象存储;需要对数据进行增删改查

主流的数据库架构:

  1. Room
  2. GreenDao
  3. ObjectBox

Room数据库

Client => Root => SupportSQLiteOpenHelper

主要的3个组件:

  1. 数据库类(Database):用于保存数据库并作为应用持久性数据底层连接的主要访问点。
  2. 数据实体(Entity):用于表示应用的数据库中的表
  3. 数据访问对象(DAO):提供应用中 可用于查询、更新、插入和删除数据库中的数据的方法。

Room相关设计

  1. build.gradle文件添加如下:
dependencies{
    def room_version = "2.4.2"
    implementation "androidx.room:room-runtime:$room_version"
    Kapt "androidx.room:room-compiler:$room_version"
    //其他依赖
  1. 定义User数据实体(Kolin?)

image.png ps: 所有属性必须都是public、或者有get、set方法。 @PrimaryKey 表示单个主键,当主键为null且auto Generate为true可以帮助自动生成键值 @ColumnInfo 列名的注解

  1. 新增DAO
  2. 新建数据库类
    1. 新建一个RoomDatabase的abstract子类
    2. 子类加注解
    3. @Database(entities = [xxx], version = n)entities包含数据实体,他将会在这个数据库中创建对应表,version是数据的版本号。
  3. 获取dao对象

Room简单实用

  1. 工程导入
  2. 数据表设计
  3. 新增Entity数据实例——用于定义表名和列名
  4. 新增DAO接口——定义需要用到的数据库操作方法
  5. 新增RoomDatabase抽象子类——定义数据库的版本等
  6. 获取db和AO对象——调用dao接口进行增删改查操作

Room原理介绍

  • 编译期,通过kapt处理@Dao@Database注解,动态生成对应的实现类;kapt生成代码在build/generated/source/kapt/
  1. AppDatabase => AppDatabase_Impl
  2. UserDao =>UserDao_Impl
  • 底层使用Android提供的SupportSQLiteOpenHelper实现数据库的增删改查等操作

总结

  1. 信息流的数据要能够无限刷新
    • 实用网络请求,实时从服务端获取数据
    • 可以按需选择合适的网络框架,也可以自己做个二次封装
  2. 每次冷启,能快速展现信息流内容
    • 实用数据库存储,将数据存储在本地
    • 冷启时直接从数据库读取,直接进行数据解析和展示

Q & A

rxjava具有一些不错的特性

Room是对SQLite的封装,它的底层是由SQLite实现的:数据需要增删改查就存储在SQLite里,如果不需要可以不用。客户端数据存储较小,SQLite合适。移动端数据量很大