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

82 阅读3分钟

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

文中截图多来源于字节跳动夏令营讲座课件与学习资料,若有侵权请联系删除,感激不尽

1.目前开源网络库对比图

pic1.png

2.Retrofit

题外话:记得第一行代码里郭神把Retrofit称为最好的网络库。目前Retrofit也是用的人最多,所以还是有点期待的。(虽然Retrofit只是对Okhttp的一种封装)
使用介绍:
(1)添加依赖:不多说
(2)创建 用于描述网络请求 的接口:如下代码

interface IUserInfoService {

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

    //@GET("users/{name}/uid")
    //fun getRequest(@Path("name" name:String)) Call<User>
    
    //后续可以增加其他的接口,一个接口对应一个api请求
}

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

(3)发起网络请求

  • a.创建Retrofit实例
   val retrofit = Retrofit.Builder()
       .baseUrl("https://www.bytedance.com/")
       .build()
  • b.创建请求接口的实例后,请求一个Call实例
val iUserInfoService = retrofit.create(IUserInfoService::class.java)
val call = iUserInfoService.getUserName(1123)
  • c.调用call.enqueue方法进行异步请求
    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
        }
    })

当然也有同步请求,基本都用异步

  • d.处理返回体
    /

Retrofit中有许多注解可以实现各种各样的功能,具体上官网看吧。square.github.io/retrofit/

3.数据存储

pic2.png

其实个人认为文件存储和ContentProvider都不能算存储方式
主要讨论Room。
Room其实是对SQLite的封装,Room三个主要组件:

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

pic3.png

Room使用
(1)Room接入:添加如下依赖

96bb2627d5a24122ad359f26b9b69074~tplv-k3u1fbpfcp-zoom-in-crop-mark 3024 0 0 0.webp

(2)设计数据表:
这里用一个表名为user,包含uidfirst_namelast_name 3个字段的简单表演示。

(3)新建一个实体

pic5.png 注解的意思就不介绍了应该看得懂。

(4)新建一个DAO接口用来实现增删改查

pic6.png

(5)新建一个数据库类
配置该类以满足:

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

pic7.png

(6)获取DAO对象,即可实现增删改查

1a3c04a698f445c99ac39ab40daa5632~tplv-k3u1fbpfcp-zoom-in-crop-mark 3024 0 0 0.webp