这是我参与「第四届青训营 」笔记创作活动的第4天 主要为思维导图大纲,收集课堂要点和一些补充知识 欢迎补充&指正
1.网络通信
1.网络请求框架对比
2.Retrofit使用介绍
-
假设知道uid,如何通过服务端查姓名?
-
1.方法 接口:网址 类型:GET请求 接口返回"message""data"
-
2.Retrofi使用步骤
-
1.在Retrofit接口的module新增依赖
- dependencies{implementation'com.squareup.retrofit2:retrofit:2.4.0'}
-
2.创建描述网络请求的接口
- interface IUserInfoService{ @GET("user/{uid}/name") //注释,用于指定该接口的相对路径,用GET方法发起请求 }fungetUserName(@Path("uid")uid:Int):Call //返回值
-
3.发起网络请求
-
3.1创建Retrofit实例
- fun getUserName(view: View) { val retrofit = Retrofit.Builder() .baseUrl("www.bytedance.com/") .build()
-
3.2创建请求接口实例,并获取Call实例
-
//创建iUserInfoService实例
-
-
-
val iUserInfoService = retrofit.create(IUserInfoService::class.java) //创建网络请求Call对象 val call = iUserInfoService.getUserName(1123)
- 3.3调用call.enqueue实例//发起异步请求 call.enqueue(object : Callback {
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 }}) }
-
3.注解
-
1.例子
- @override :标注一个方法重写了父类的实现
- @Nullable:对象可能为空
- @GET:get方法
- @Path修饰参数,可以由相应的参数代入
-
2.生命周期
- 1.SOURCE 只在源码中有效,编译时抛弃
- 2.CLASS 编译class文件时有效,使用注解处理器APT
- 3.RUNTIME 运行期间获得注解(retrofit)
-
- *.java -> *.class-> *.dex-> *.apk 然后运行
-
3.注解的获取和使用
- 1.Method.getGenericReturnType()获取返回类型
- 2.Method.getAnnotations()获取方法的注解
- 3.Method.getParameterAnnotations()获取参数注解
-
4.Java动态代理Proxy.newProxyInstance
- 调用interface里的某个方法,实际调用InvocationHandler的invoke方法
-
-
4.Retrofit主流程
- 1.创建RetrofitConfig,保存baseUrl的内容
- 2.创建动态代理对象
- 3.创建OkHttpCall
- 4.发起网络请求
-
3.TTNet
- 特点
- 1.改造自retrofit
- 2.支持http网络库动态切换(okhttp和cronet)
- 3.支持网络拦截配置;添加公共参数,动态切换协议及host,动态选路等
- 修改OKhttp网络库改为Cornet
- OkHttpClient
- OkHttpCall
2.数据存储
1.存储方式对比
-
1.SharedPreference
- 1.只存简单数据类型
- 2.键值对存储
-
2.文件存储
- 1.各种格式到手机
- 2.文件默认不能跨app
-
3.ContentProvider
- 1.可跨App
- 2.通过Uri访问
-
4.SQLite存储数据
- 1.可存储结构化数据
- 2.便于增删查改
2.数据库框架对比
- Room
- GreenDao
- ObjectBox
3.Room数据库使用对比
-
1.Room在SQLite提供抽象层
-
2.Room组件
-
1.DataBase数据库类
-
2.Entity数据实体
- 表示数据库中的表
-
3.DAO访问对象
- 提供增删查改的方法
-
-
3.实践
-
1.Room接入
-
2.数据表接入
-
3.新建Entity
- user每个实例代表app数据库user表的一行
-
4.新建DAO
- 对user的增删查改
-
5.新建数据库
- 1.新增RoomDatabase的abstract子类
- 2.子类加注解@Database(entities=[xxx],version=n)
- 3.每个关联数据库的DAO类,数据库都定义一个无参数的抽象方法并返回DAO实例
-
6.获取DAO对象
-
4.Room数据库原理介绍
-
1.核心
- 1.编译期,通过kapt处理@Dao、@Database注解,动态生成对应的实现类
- 2.底层使用Android提供的SupportSQLiteOpenHelper实现数据库的增删改查等操作
-
2.原理介绍
-
1.kapt注解处理
- Room在编译期,通过kapt处理@Dao和@Database注解,生成DAO和Database的实现类 AppDatabase --> AppDatabase_Impl UserDao-->UserDao_Impl
-
2.实现类利用Android SQLite进行数据库操作
-
1.AppDatabase_Impl:数据库实例的具体实现,自动生成
-
2.createOpenHelper(): Room.databaseBuilder().build()创建Database时,会调用实现类的 createOpenHelper()创建SupportSQLiteOpenHelper,此Helper用来创建DB以及管理版本
-
3.userDao():创建UserDao_Impl
-
4.UserDao_Impl: UserDao的具体实现,自动生成
- 1.__db:RoomDatabase的实例
- 2.__insertionAdapterOfUser :EntityInsertionAdapterd实例,用于数据insert
- 3.__deletionAdapterOfUser:EntityDeletionOrUpdateAdapter实例,用于数据的update/delete
-
-