这是我参与「第四届青训营 」笔记创作活动的第4天。
以下是第四堂课的笔记和总结
数据存储&网络通信
网络通信
网络库开源框架
- HttpURLConnection
- Volley
- OkHttp
- Retrofit
Retrofit介绍
目前最热门的网络请求封装框架,是对OkHttp的一个封装。
-
使用步骤
-
Retrofit库引入
添加依赖dependencies
-
创建描述网络请求的接口
interface IUserInfoService{ // 接口类名,如用户信息 @GET("")// @Get注解,表示使用get请求,里面是相对路径 fun getUserName(@Path("") uid: Int):Call<ResponseBody>;// 接口具体函数,如获取用户姓名 // @Path参数注解,可以将形如{uid}的参数进行替换 // Call<ResponseBody>将返回值string自动转换为Model类 } -
使用Retrofit实例发起网络请求
-
创建Retrofit实例
val retrofit = Retrofit.Builder() .baseUrl("") // 设置网络请求URL地址 .build(); -
创建请求接口实例,并获取Call实例
val iUserInfoService = retrofit.create(IUserInfoService::class.java); val call = iUserInfoService.getUserName("id"); -
调用call.enqueue进行异步请求
call.enqueue(object : Callback<ResponseBody>) { override fun onResponse(call Call<ResponseBody>, response: Response<ResponseBody>); // 请求成功时回调,可以对返回数据进行处理 override fun onFailure(call Call<ResponseBody>, e: Throwable); // 请求失败时回调,print报错信息 };
-
-
TTNET介绍
字节跳动内部使用的网络封装库,是基于Retrofit进行二次开发,将底层实现的OkHttp替换为Cronet,用法与Retrofit基本一致。
数据存储
数据储存方式对比
-
SharePreferences
特点:只能存boolean,int,float,long,String五种简单类型,使用键值对存储。
使用场景:记录app的各种配置信息,如用户切换的开关等。
-
文件存储
特点:可以将各种格式的文件存到手机中,一般不能跨app共享。
使用场景:网络下载的zip包,txt文件的存储。
-
ContentProvider
特点:可跨app共享,通过Uri对象访问。
使用场景:音频、视频、图片、通信录的读写。
-
SQLite存储数据
特点:可存储结构化数据,增删查改方便。
使用场景:保存feed流数据,并增删查改。
数据库框架
- Room(包增量小,使用成本高,但支持功能最多)
- GreenDao
- ObjectBox(包增量最大,综合性能最好,但支持功能少)
Room数据库使用介绍
-
添加依赖dependencies
-
新建Entity
@Entity data class User( @PrimaryKey(autoGenerate = true) val id: Int?, // 表示主键,当主键为null且autoGenerate为true时,可自动生成 @ColunmnInfo(name = "") val xxx: String?, // 列名注解 ) -
新增Dao
@Dao interface UserDao{ @Query("SELECT * FROM user") // 查询 fun getAll(): List<User>?; @Query("SELECT * FROM user WHERE id IN (:ids)") // 指定查询 fun loadAllByIds(userIds: IntArray): List<User>?; @Insert // 增加 fun insertAll(vararg users: User); @Delete // 删除 fun delete(user: User) } -
新建数据库类,进行数据库配置,并满足以下条件
- 新建RoomDatabase的abstract子类
- 子类注解
@Database(entities = [xxx], version = n),entities包含数据实体,version是数据版本号 - 对于每一个数据库关联的DAO类,数据库都必须定义一个无参的抽象方法,并返回DAO类实例
@Database(entities = [User::class], version = 1) abstract class AppDatabase : RoomDatabase() { abstract fun userDao(): UserDao; } -
获取dao对象
val db = Room.databaseBuilder(applicationContext, AppDatabase::class.java, "database-name") .build(); userDao = db.userDao();即可进行增删查改
Room数据库原理(略)
- 编译阶段,通过kapt处理@Dao、@Database注解,动态生成对应的实现类
- 底层使用Android提高的SupportSQLiteOpenHelper实现数据库的增删改查
总结
本堂课学习了Android网络通信与数据存储方面的知识,主要学习了主流的Retrofit网络封装框库和Room数据库存储的基本使用。通过这节课的学习,我学到了如何能够使app向网络接口实时请求数据,获取信息流数据,并储存在本地进行长期保存。这两个知识点对我的水平有很大的提升,比如从开发单机应用变成了开发联网应用,再也不用每次打开app都不能保存之前的数据等,是相当重要的一课。