这是我参与「第四届青训营 」笔记创作活动的第7天
文中截图多来源于字节跳动夏令营讲座课件与学习资料,若有侵权请联系删除,感激不尽
1.目前开源网络库对比图
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.数据存储
其实个人认为文件存储和ContentProvider都不能算存储方式
主要讨论Room。
Room其实是对SQLite的封装,Room三个主要组件:
- 数据库类(
Database),用于保存数据库并作为应用持久性数据底层连接的主要访问点。 - 数据实体(
Entity),用于表示应用的数据库中的表。 - 数据访问对象(
DAO),提供您的应用可用于查询、更新、插入和删除数据库中的数据的方法。
Room使用
(1)Room接入:添加如下依赖
(2)设计数据表:
这里用一个表名为user,包含uid、first_name、 last_name 3个字段的简单表演示。
(3)新建一个实体
注解的意思就不介绍了应该看得懂。
(4)新建一个DAO接口用来实现增删改查
(5)新建一个数据库类
配置该类以满足:
- 新增一个
RoomDatabase的abstract子类 - 子类需加注解
@Database(entities = [xxx], version = n),entities包含数据实体,将会在这个数据库中创建对应的表,version是数据的版本号 - 对于与数据库关联的每个DAO类,数据库类必须定义一个无参的抽象方法,并返回DAO类实例
(6)获取DAO对象,即可实现增删改查