在经历了OkHttp、Retrofit、RxJava的学习后,终于可以开始写代码rua!
附框架学习笔记:学习笔记| OkHttp+Retrofit+Dagger2+RxJava+MVP架构
由于网络上安利这几款火的不行的框架的博客实在是太多太多太多了,介绍、优缺点之类的废话就不多说了,这里只介绍下关系。
- Retrofit:Retrofit是Square公司开发的一款针对Android 网络请求的框架(底层默认是基于OkHttp 实现)。
- OkHttp:也是Square公司的一款开源的网络请求库。
- RxJava :“a library for composing asynchronous and event-based programs using observable sequences for the Java VM”(一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库)。RxJava使异步操作变得非常简单。
各自职责:Retrofit 负责 请求的数据 和 请求的结果,使用 接口的方式 呈现,OkHttp 负责请求的过程,RxJava 负责异步,各种线程之间的切换。
一、添加依赖
在build.gradle文件中添加如下配置:
// rxjava
implementation 'io.reactivex.rxjava2:rxandroid:2.1.0'
implementation 'io.reactivex.rxjava2:rxjava:2.2.3'
// retrofit
implementation 'com.squareup.retrofit2:retrofit:2.4.0'
implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
implementation 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
// okhttp
implementation 'com.squareup.okhttp3:okhttp:3.11.0'
//gson
implementation 'com.google.code.gson:gson:2.8.5'
二、更新token模块
有关JWT的知识可以看一下大神的博客:JSON Web Token 入门教程 - 阮一峰
刷新tokenAPI
实现思路
利用 Observale 的 retryWhen 的方法,识别 token 过期失效的错误信息,此时发出刷新 token 请求的代码块,完成之后更新 token,这时之前的请求会重新执行,但将它的 token 更新为最新的。另外通过代理类对所有的请求都进行处理,完成之后,我们只需关注单个 API 的实现,而不用每个都考虑 token 过期,大大地实现解耦操作。
Token 存储模块
存储token使用的是SharedPreferences + 单例模式 避免并发请求行为
public class Store {
private SharedPreferences mStore;
// 单例模式
private Store(){
mStore = App.getContext().getSharedPreferences(App.MY_SP_NAME, Context.MODE_PRIVATE);
}
public static Store getInstance() {
return Holder.INSTANCE;
}
private static final class Holder {
private static final Store INSTANCE = new Store();
}
public void setToken(String token) {
mStore.edit().putString(App.USER_TOKEN_KEY, token).apply();
}
public String getToken() {
return mStore.getString(App.USER_TOKEN_KEY, "");
}
}
完整的Token请求过程
我将token请求提取到retrofit service层方便全局调用,使用直接返回一个observable对象,对其订阅在观察者里实现携带token的请求数据操作。并且这里特意没有用lambda表达式写,对于理解会方便很多
/**
* 获取新的Token
*/
private static final String ERROR_TOKEN = "error_token";
private static final String ERROR_RETRY = "error_retry";
public