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

121 阅读3分钟

这是我参与「第四届青训营 」笔记创作活动的第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)
          1. *.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