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

370 阅读4分钟

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

本堂课重点内容:

本期学习的笔记是与数据存储与网络通信相关的知识。

详细知识点介绍:

网络通信

网络通信是app获取、交换信息的重要部分,app内容的获取离不开网络通信,所以我们首先了解一下目前常见网络通信框架。

常见网络通信框架对比

image.png

目前业界许多是Retrofit和OkHttp组合的这种方式来进行网络请求

Retrofit介绍

Retrofit是square开源的网络请求库,是对Okhttp的一个封装,网络请求速度很快。目前得到了广泛的使用。

可以使用在如下图所示的案例时: 客户端知道了一个用户的uid,想通过服务端查下这个用户的姓名

Retrofit使用介绍

1. 在使用前需要在build.gradle添加如下依赖:

dependencies { 
    implementation 'com.squareup.retrofit2:retrofit: (insert latest version) '
    //...其他依赖 }

2.创建相关接口

//接口类名:可自定义,尽量和这类请求的含义相关
interface IUserInfoService {

    @GET("users/{uid}/name")
    fun getUserName(@Path("uid") uid: Int): Call<ResponseBody>
}

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

3.发起网络请求

    fun getUserName(view: View) {
    //创建Retrofit实例
    val retrofit = Retrofit.Builder()
        .baseUrl("https://www.bytedance.com/")
        .build()
    //创建iUserInfoService实例
    val iUserInfoService = retrofit.create(IUserInfoService::class.java)
    //创建网络请求Call对象
    val call = iUserInfoService.getUserName(1155)
    //发起异步请求
    call.enqueue(object : Callback<ResponseBody> {

        override fun onResponse(call: Call<ResponseBody>,
                                response: Response<ResponseBody>) {
            //请求成功时回调
            request_result_tv.text = "请求成功:" + response.body()!!.string()
        }

        override fun onFailure(call: Call<ResponseBody>, e: Throwable) {
            //请求失败时候的回调
            request_result_tv.text = "请求失败:" + e.message
        }
    })
}

上述代码参考于:【Android 客户端专场 学习资料二】第四届字节跳动青训营 - 掘金 (juejin.cn)

除此之外Retrofit还有多种请求方法与请求注释,相关知识可以从官网获得。Retrofit 官网

TTNET介绍

TTNet是字节跳动基于Retrofit二次开发的通用的网络请求封装框架。

它有以下几个优点:

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

TTNET实现原理图如下图所示

image.png

图片来源于​‌‍‬⁠⁡⁢⁣⁤TTNet 源码分析

数据存储

数据存储分类

常见的数据存储主要有以下四种

image.png

数据库开源框架对比

下面是几个主流的数据库框架对比

不同的产品使用了不同的产品框架,其中Room由于是Google出品,因此更加受欢迎,接下来对Room框架进行更深一步的介绍。

Room数据库的使用

Room是 Google Jetpack 家族里的一员,Room 在 SQLite 上提供了一个抽象层,以便在充分利用 SQLite 的强大功能的同时,能够流畅地访问数据库,其主要分为3个组件

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

其详细使用方案可以查看使用 Room 将数据保存到本地数据库  |  Android 开发者  |  Android Developers (google.cn)

实践练习

可以通过Android官方的案例带 View 的 Android Room - Kotlin进行学习

课后总结

本节课学习了数据存储与网络通信的相关知识,对RetrofitRoom框架有了一个较为清晰的认识。

引用参考

  1. 【Android 客户端专场 学习资料二】第四届字节跳动青训营 - 掘金 (juejin.cn)
  2. TTNet 源码分析
  3. 使用 Room 将数据保存到本地数据库  |  Android 开发者  |  Android Developers (google.cn)