这是我参与「第四届青训营」笔记创作活动的第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。
个人总结
这一堂课学的我有点眼睛花花,头脑晕晕,非常多理论的东西,甚至是边听边记都比较麻烦,可能老师一句话我要退回去好几遍才能打完,不然就到下一句知识点了哈哈,可能到时候结束我的打字速度又能上升一个台阶(?),还有好多笔记没整理,溜了溜了,继续努力吧只能说。