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

126 阅读5分钟

这是我参与「第四届青训营」笔记创作活动的第2天。这周的课程结束后,我将两节课的内容进行了整理,将会慢慢发出,也在这个过程中继续打好学习安卓的基础。

网络通信

App内容的获取都是通过网络请求,这是app的基础能力。例如我们刷抖音的时候,还有刷某大眼仔的时候,大眼仔甚至还有实时广场这一说法,随时刷新。

网络请求框架对比:

HttpURLConnection AndroidSDK:只有少量的网络请求时使用

ps:感觉我以前为了省流量只看小说就是使用这个网络框架tt。

Volley Google:以前使用Volley且无需大文件下载的App,比较老的项目,使用的也是Volley。

Volley目前已经停更了,所以现在用的几乎没有哩。

OkHttp square :使用成本比Volley高一些,但是功能也强大了不少,支持大文件的上传下载,可以设置拦截器。

拦截器:可以在APP范围内可以统一进行网络请求的拦截设置,在拦截器中可以添加一些通用参数,或者进行一些安全合规的检测。当某个接口出现敏感参数,拦截器就可以对其进行拦截处理。

Retrofit:可以说的是网络请求封装框架,实际上是OkHttp的二次封装。也因为是基于OkHttp进行二次封装,所以它具备OkHttp的所有优点,并且可以通过注解配置请求,还可以搭配转换器将我们获得的数据进行解析。

Cronet与OkHttp的区别:都是相对底层的网络请求、网络封装,Cront的底层使用的是C++,而OkHttp底层使用的是Java。

Retrofit的快速使用:

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

dependencies{ implementation 'com.squareup.retrofit2:retrofit:2.4.0' }

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

接口类名和方法名都是可以自定义的,但需要尽量符合Java的语法规则与规范,interface里可以增加多个不同的函数。

tips:Java的语法规则中,接口名、变量名、常量名、方法名和类名都为标识符,遵循标识符语法规则,在此不做过多赘述。接口名的语法规范是:开头第一个字母大写,后面跟着的单词首字母大写。方法名的语法规范是:首字母小写,后面跟着的单词首字母大写。(虽然是规范不这么写也不会报错,但是还是遵循好

interface IUserInfoService{
           @GET("users/{uid}name")          
           fun getUserName(@Path("uid")uid : Int): Call<ResponseBody>
          }

@GET注解:表示用于指定该接口的相对路径,并采用get方法发起请求。

@Path注解:需要外部调用时,传入一个uid,该uid会替换@get注解里相对路径的{uid} (可以想为是平时在idea重写和重载时出现的@Override和@Overload,快捷键Alt+Insert

返回值Call:这里使用responsebody,可以直接拿到请求的String内容 如果要自动转为Model类,例如User,这里直接替换为User就好。

3.发起网络请求

第一步先创建Retrofit实例,之后创建请求接口的实例并获取到call实例,接着调用call.enqueue进行异步请求,最后即可处理返回的数据。

Retrofit主流程:

1.通过Builder模式,创建RetrofitConfig,保存baseUrl内容

2.创建动态代理对象

3.创建OkHttpCall,Retrofit主要是通过这来发起网络请求的

4.发起网络请求

Retrofit里OkHttpClient创建时机:

第一步是获取我们的Retrofit实例,是通过build方法,若我们要传入一个callFactory会默认去new一个OkHttpClient,之后我们的callFactory会传到Retrofit构造方法中,后保存。

注解

注解可以理解是一个标签,可以作用在类方法参数成员变量上,并且在合适的实际读取注解,进行处理,注解可以仅仅是一个文字的说明也可以携带一些信息,作用多样。

注解类型:除了@Path和@GET还有很多注解,例如我们刚入门时最常见和使用的@Override ,常见的注解还有:@Deprecated、@SuppressWarnings、@SafeVarargs和@FunctionalInterface。

注解的生命周期@Retention:

1.SOURCE:只有在源码中有效,编译时抛弃,例如@Override。

2.CLASS:编译class文件有效,一般会使用到注解处理器。

3.RUNTIME:在运行阶段有效,获取对应的注解,并做相关的处理。

@Target():指定作用的对象,例如@Target(METHOD)。

@Retention(RUNTIME):说明这个注解要保留到运行时。那么我认为同理@Rentention(SOURCE):说明这个注解在编译时抛弃。

Retrofit是在运行期间配合Java动态代理获取方法和参数的注解并构造Request对象的 java动态代理Proxy.newProxyInStance。

个人总结

这一堂课学的我有点眼睛花花,头脑晕晕,非常多理论的东西,甚至是边听边记都比较麻烦,可能老师一句话我要退回去好几遍才能打完,不然就到下一句知识点了哈哈,可能到时候结束我的打字速度又能上升一个台阶(?),还有好多笔记没整理,溜了溜了,继续努力吧只能说。