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

122 阅读2分钟

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

数据存储&网络通信

网络通信

App内容的获取,都是通过网络请求,是APP的基础能力

网络库开源框对比

  • 1.HttpURLConnection:谷歌自带的包,包体积容量:0kb,使用成本较高:2n,需要自己做封装,例如线程池管理,返回的数据解析,只有少数网络请求的工具类APP使用。
  • 2.Volley:谷歌开发的,包体积容量:57kb,使用成本:n,适用于网络请求频繁,传输数据量小的场景,不适合用来上传文件和下载(不支持输入输出流),已停更,使用场景:之前使用Volley,且无需大文件下载的APP
  • 3.OkHttp:Square公司开发,包体积容量:262kb,使用成本:1.5n,可以设置拦截器,支持大文件上传和下载,由于其基于NIO和Okio性能好,一般需要二次封装使用,使用场景:一般比较少直接使用,可搭配Volley或Retrofit
  • 4.Retrofit:Square公司开发,包体积容量:343kb,使用成本:2n,具备OkHttp所有的优点,且更出色。restful api设计风格,通过注解配置请求,包括请求方法,请求参数,请求头等,可以搭配多中Converter将获取的数据解析,支持Gson、jackson、Protobur等,使用场景:团队内有研发人员对Retrofit比较熟悉时可用

常用框架Retrofit

Retrofit是对OkHttp的一个封装

使用方法:

  • 1.Retrofit库的引入
  • 2.创建用于描述网络请求的接口
  • 3.使用Retrofit实例发起网络请求 使用介绍:

1.在需要用到Retrofit接口的module中,新增依赖

dependencies{
    implementation 'com.squareup.retrofit2:retrofit:2.4.0'
    //...其他依赖
}

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

interface IuserInfoServise{
    @get("users/{uid}/name")
    fun getUserName(@Path("uid") uid: Int): Call<ResponseBody>
    //后续可以增加其他的接口,一个接口对应一个api请求
}

定义说明:

  • 接口类名:可自定义,尽量和这类请求的含义相关
  • 函数名:可自定义,需要能识别出该接口的作用,该interface里可以增加多个不同的函数
  • @GET注解:用于指定接口的相对路径,并使用Get方法发起请求
  • @Path注解:需要外部调用时,闯入一个uid,该uid会替换@GET注解里相对路径的{uid}
  • Call <ResponseBody:这里用ResonseBody,我们可以直接拿到请求的String内容,如果要自动转化为Model类,例如User,这里直接替换为User就好。

3.发起网络请求

image.png

  • 1.创建Retrofit实例
  • 2.创建请求接口的实例,并获取到Call实例
  • 3.调用call.enqueue进行异步请求

注解:

可以理解为一种标签,可以加载类、方法、参数、成员变量上、并且可在合适的实际读取注解的内容,进行处理

例如常见的:

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

image.png

字节内部框架TTNET

既支持Retrofit又支持Cronet

优点:

  • 1.基于Retrofit改造,具有Retrofit所有的优点
  • 2.支持多个Http网络库的动态切换
  • 3.支持网络拦截配置:添加公共参数,动态切换协议及Host,动态选路等
  • 4.支持流解析,json序列化

数据存储

了解本地存储的4大方式和使用场景,重点了解Room数据库

数据存储方式对比

常见的数据存储

image.png

数据库框架对比

image.png

Room数据库使用介绍

Room是Goole Jetpack家族里的医院,Room在SQLite上提供了一个抽象层,以便在充分利用SQLite的强大功能的同时,能够流畅的访问数据库

image.png

主要组件:

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

使用方法: 1.Room接入

①Gradle目录的build.grable文件里添加:

dependencies{
    def room_version - "2.4.2"
    implementation "androidx.room:room-runtime:$room_version"
    kapt :androidx.room:room-compiler:$room_verion"//注解处理器
    //...其他依赖
}

②数据表设计

③新建Entity:定义一个User数据实体,User的每个实例都代表App数据库中User表的一行

注:

  • 1.所有属性必须是public、或者有get、set方法
  • 2.@PrimaryKey:表示单个主键,当主键值为null且autoGenerate为true时可以帮助自动生成键值
  • 3.@ColumnInfo:列名的注解 ④新增DAO:定义一个名为UserDao的Dao。用来对user表的增删改查 查:注解Query

⑤新建数据库类,进行数据库配置,并需满足以下几个条件:

  • 1).新增一个RoomDatabase的Abstract子类
  • 2).子类需要加注解#Database(entities = [xxx],version = n),entities包含数据实体,将会在这个数据库中建立对应的表,version是数据的版本号
  • 3).对于与数据库关联的每个Dao类,数据库类必须定义一个无参的抽象方法,并返回DAO类实例

⑥获取dao对象,即可进行增删改查

Room数据库原理介绍

核心:

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

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