Android-网络请求与数据存储 |青训营笔记

377 阅读5分钟

Android-网络请求与数据存储|青训营笔记

这是我参加「第四届青训营」笔记创作活动第三天

网络通信

App内容的获取,都是通过网络请求作为app的基础能力

  1. 网络库开源框架对比

image.png

  1. Retrofit

Retrofit是目前Android平台上,可以说是最热门的网络请求封装框架,是对OKHttp的一个封装

image.png

  1. Retrofit库的引入
  2. 创建用于描述网络请求的接口
  3. 使用Retrofit实例发起网络请求

使用介绍

1.在需要用到Retrofit接口的module中,新增依赖

2.创建用描述网络请求的接口

定义说明

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

3.发起网络请求

  • 创建Retrofit实例
  • 创建请求接口的实例,并获取call实例
  • 调用call.enqueue进行异步请求
  • 处理返回数据 注解类型:

image.png 3. TTNET介绍

网络请求框架 有以下几点:

  • 基于Retrofit改造,具备了Retrofit所具有的优点
  • 支持多个Http网络库的动态切换(okHttp和cronet)
  • 支持网络拦截配置:添加公共参数,动态切换协议及Host动态路径等

注解介绍

有定义和使用注解的地方,肯定还需要有获取注解并处理注解内容的地方 注解的处理,一般有3个时机(也就是注解的生命周期@retention)

    1. SOUREC:只有在源代码中有效,编译时抛弃
    1. CLASS:编译class文件时有效,一般会使用到注解处理器
    1. RUNTIME:在运行期间,获取对应的注解,并做相关的处理

image.png

Retorfit注解@get定义

@Target:指定作用对象,这里是METHOD说明这个注解是作用在方法上 其他枚举值:

  • PARANETER:参数
  • FIELD:类成员

@RETENTION:指定注解生命周期,这里是RUNTINE,说明要这个注解要一直保持到运行时 注解是获取和使用

通过反射获取到Method对象后,有以下一些接口来获取注解内容

  • Method.getgebericreturmType()获取返回类型
  • Method.getAnnotation()获取方法的注解
  • Method.getParameterAnnotation()获取参数注解 Retrofit是运行期间,配合java动态代理,获取方法参数的注解,并构造Request对象

image.png

Retrofit主流程

  1. 通过Builder模式,创建RetorfitConfig保存baseUrl等内容
  2. 创建动态管理对象
  3. 创建okhttpcall
  4. 发起网络请求

image.png

Retrofit调用okhttp image.png

TTNet类图设计

核心功能要是替换其中2点

  1. 替换底层用到的okhttpclient
  2. 替换底层用到的okhttpcall

image.png

image.png

总结

image.png

数据存储

数据存储方式对比

  1. 持久性的本地数据存储是Android中常见的能力,可以在应用被杀死的情况下,而保持数据不会被清除。我们可以根据不同场景的诉求,可以选用不同的存储方式,常见的数据存储主要有以下4种

image.png

数据库框架对比

数据库 相对来说,数据库的使用会比较复杂,以下是主流数据库框架的对比

image.png

Room数据库使用介绍

  • Room是Qoogle Jeptpack 家族里的一员,Room在SQLite上提供了一个抽象层,以便在充分利用SQLite的强大功能的同时,能流畅的访问数据库

image.png

主要的三个组件

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

image.png

Room数据库原理介绍

核心

编译期,通过kapt处理@Dao、@database注解,动态生成对应的实现类 底层使用Android提供的SupportSQLiteOpenHelper实现数据库的增删改查等操作

kapt注解处理

Room在编译期,通过kapt处理@Dao和@Database注解,生成DAO和Database的实现类

image.png

image.png

AppDatabase_impl:数据库实例的具体体现,自动生成,主要有以下几个方法

  • createOPenHelper():ROOm.databaseBuilder().build()创建Database时,会调用实现类的
  • createOpenHelper()创建SupportSQLiteOpenHelper,此Helper用来创建DB以及管理版本
  • userDao():创建UserDao_lmpl

AppDatabase_impl的两个具体实现:

  • createOpenHelper()
  • userDao()

UserDao_lmp:UserDao的具体实现,自动生成,主要有以下3给成员变量以及UserDao里定义的接口

  1. 3核心的成员变量:
  • _ _db:ROOmDatabase的实例
  • _ _inaertionAdaoter:EntitylnsertionAdapterd实例
  • _ _deletionAdapterOfUser:EntityDeletionOrUpdateAdapteer实列用于数据的update/delete

n个是UserDao里我们自己定义的接口的具体实现:

  • insertAll()
  • delete()
  • getAll()
  • loadAllBylds()
  • findByNames()
  • UserDao_imp#insertAll():

  • 使用__db开启事务,

  • 使用__insertonAdapterofUser执行插入操作

  • UserDao_imp#delete():

  • 使用__db开启事务,

  • 使用__insertonAdapterofUser执行删除操作

  • UserDao_imp#getAll():
  1. 自动生成sql语句
  2. 获取数据库的Cursor光标
  3. 使用Cursor循环读取数据库的每条记录

总结

image.png