数据存储&网络通信

152 阅读5分钟

网络通信:我们一般都是通过网络请求来获得App内容

- 网络库开源框架对比

  1. HttpURLConnection:需要自己做封装,例如线程池管理、返回的数据解析。只有少量网络请求的工具类APP
  2. Volley:比较适合网络请求频繁,同时传输数据量小,不太适合上传文件和下载,现已停更。
  3. OkHttp:可以设置拦截器,支持大文件上传和下载,基于NIO和Okio,性能更好,一般需要二次封装使用。很少直接使用,可以搭配Volley或Retrofit
  4. Retrofit:它具备OkHttp所有的优点,更加出色。1.restful api设计风格2.通过注解配置请求(请求方法,参数,头等)3.可以搭配多种Converter将获得的数据解析,支持Gson、jackson、Protobur等。

- Retrofit介绍

目前Android平台上最热门的网络请求封装框架,对OkHttp的一个封装

使用方法

1. 在需要用到Retrofit接口的module中,新增依赖‘com.squareup.retrofit:2.4.0’

2. 创建用于描述网络请求的接口

  • 接口类名:可自定义,尽量和这类请求的含义相关 (IUserInfoService)
  • 函数名:自定义,需要识别出该接口的作用,接口中可以增加多个不同的函数(getUserName)
  • @GET注解:用于指定该接口的相对路径,并采用Get方法发起请求
  • @Path注解:需要外部调用时,传入一个uid,该uid会替代@GET注解里的相对路径的{uid}
  • 返回值Call<ResponseBody>:这里用ResponseBody,我们可以直接拿到请求的String内容

青训营课件2.jpg

来源:青训营课件

3. 发起网络请求

  • [3.1 ] 创建Retrofit实例
  • [3.2 ]创建请求接口的实例
  • [3.3 ]调用call.enqueue进行异步请求

青训营课件.jpg

来源:青训营课件

注解类型

青训营课件3.jpg

来源:青训营课件

TTNET介绍->字节跳动的网络库,与Retrofit基本一致

原理:基于Retrofit进行二次开发
    替换掉底层的OkHttp,改为自研的Cronet

优点

  1. 基于Retrofit改造,具备了Retrofit所具有的优点
  2. 支持多个Http网络库的动态切换(okhttp和cronet)
  3. 支持网络拦截配置:添加公共参数,动态切换协议及Host,动态路选等...

注解介绍:Retrofit用到了非常多的注解。

   注解可以理解为是一个标签,这个标签可以加在类,方法,参数,成员变量上,
   并且可在合适的时机读取注解的内容,进行处理。

举例:

  @Override:标注一个方法是重写了父类的实现
  @Nullable:标注所描述的对象有可能为空
  

注解的处理:一般有三个时机(也就是注解的生命周期@Retention)

  SOURCE:只有在源码中有效,编译时抛弃,例如@Override
  CLASS: 编译class文件时有效,一般使用到注解处理器
  RUNTIME :在运行期间,获取对应的注解,并做相关的处理
                   *.java-->*.class-->*.dex-->*.apk-->runtime
                  

注解的获取和使用:通过反射获得Method对象后,有以下一些接口来获取注解内容

1. Method.getGenericReturnType()获取返回类型
2. Method.getAnnotations()获取方法的注解
3. Method.getParameterAnnotations()获取参数注解

青训营课件.png

来源:青训营课件

**Retrofit是在运行期间,配合Java动态代理,获取方法和参数的注解,并构造Request对象的**

image.png

来源:青训营课件

Retrofit主流程

1.通过BUilder模式,创建RetrofitConfig,保存baseUrl等内容
2.创建动态代理对象
3.创建OkHttpCall
4.发起网络请求

image.png

来源:青训营课件

Retrofit调用OkHttp

在主流程图中,okhttp网络库的api,在Retrofit中是何时发起请求的,对应的api已列出,相同颜色即意味着调用关系。
绿色代码:标记1处,创建Retrofit对象时,对应的创建了OkHttpClient对象
红色代码:标记4处,使用Retrofit的Call对象发起请求时,对应创建OkHttp网络库中Request网络库中Request对象和Call对象并发起请求

image.png

网络通信总结

image.png

来源:青训营课件

数据存储

- 数据存储方式对比

我们希望数据拥有持久性,就是在应用被杀死的情况下,我们的数据仍然会存在不会被清除。

因此我们根据不同场景的需求,有四种常见的数据存储方式

image.png

来源:青训营课件

- 数据库框架对比

几个主流数据库框架对比

image.png

来源:青训营课件

- Room数据库使用介绍

主要三个组件

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

Room实践案例Room接入

 1.Gradle目录的build.gradle文件添加
 

image.png

来源:青训营课件

2.设计数据库表
3.新建Entity:定义一个User数据实体,User的每个实例都代表App数据库中的user表的一行
【注意】所有的属性必须是public、或者有get/set方法
        @PrimaryKey:表示单个主键,当主键为null且autoGenerate为true时可以帮助自动生成键值
        @ColumnInfo:列名的注解
        

image.png

4.新增DAO:定义一个名为UserDao的DAO。用来对User表的增删改查

image.png

5.新建数据库类,进行数据库配置,并需要满足以下几个条件
【5.1】新增一个RoomDatabase的abstract子类
【5.2】子类需加注解@Database(entities=[xxx],version=n),entities包含数据实体,将会在这个数据库中创建对应的表,version是数据的版本号
【5.3】对于与数据库关联的每个DAO类。数据库必须定义一个无参的抽象方法,并返回DAO类实例

image.png

6.获取dao对象,即可进行数据库的增删改查操作

image.png

- Room数据库原理介绍

核心

1.编译期,通过kapt处理@Dao@Database注解,动态生成对应的实现类
2.底层使用Android提供的SupportSQLiteOpenHelper实现数据库的增删改查操作

Kapt注解处理

  Room在编译期,通过Kapt处理@Dao@Database注解,生成DAO和Database的实现类
  AppDatabase-->AppDatabase_Impl
  

image.png

  UserDao-->UserDao_Impl
  

image.png

image.png

image.png

image.png

数据存储总结

image.png

来源:青训营课件