文章的代码是来源于郭子轩,地址是:https://blog.csdn.net/gpf1320253667/article/details/84363059?utm_source=app
记得以前在格力的时候,也是用MVP架构,但是代码比较老,随着架构师离开,后面加入的新人越来越多,MVP架构逐渐变形。几乎每个Activity都持有一个自己的Presenter。每个Presenter都有大量重复的代码。而activity持有presenter这个也可能造成内存泄漏。这个可能也是网上大多数MVP架构的框架的样子。
大家看这样的一个代码:
MvpPresenter mvpPresenter = new MvpPresenter(this);
activity就这样持有了presenter的强引用。这样当页面销毁的时候。presenter里面RX的资源就会成为无法回收的垃圾。就会造成内存泄漏。
当然。你可能会想为什么不在每个activity的ondestroy里来进行解绑呢?既然都这样想了。为什么不在baseActivity里的onDestroy里进行解绑呢?对的,我们可以在baseActivity里利用泛型来传递过来具体的presneter进行解绑。更进一步,我们抽出共有的代码,创建basePresenter.我们接下来就来看具体的整体代码实现:
在此之前随便说下Retrofit和RxJava的作用是什么:
Retrofit主要是封装的OkHttp,用注解的方式来进行便捷的网络访问请求。一般是配合Rxjava使用。
RxJava主要用来处理异步任务,方便快捷切换线程。比如访问网络是在IO线程,访问完事后,显示返回来的数据又在主线程。我们用这个玩意帮我们很方便的切换。RxJava是响应式编程的一种,是属于观察者模式中的被动模式。就是我有数据了,我再通知等待我数据的那几个家伙。大家想象成我是B站的Up主,你们订阅了我的频道。我是被观察者,你们是观察者。或者说我是被订阅者,你们是订阅者。我更新了一个热舞视频,然后通知你们,你们收到手机上的通知,一看好家伙,视频更新了,赶紧跟着操练起来。就是这么个模式。
先来看整体的代码结构:
1.首先添加依赖:
// Retrofit
implementation 'com.squareup.retrofit2:retrofit:2.4.0'
// Retrofit和jxjava关联
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.4.0'
// Retrofit使用Gson转换
implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
// RxJava
implementation 'io.reactivex.rxjava2:rxjava:2.1.12'
// RxAndroid
implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'
2.创建Retrofit的工具类,因为整个项目中使用比较多,所以我们采用单例模式:RetrofitHelper
package com.example.myapplication;
import com.example.myapplication.constant.UrlConstant;
import okhttp3.OkHttpClient;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
/**
* Retrofit初始化
*/
public class RetrofitHelper {
//用private 修饰构造函数
private RetrofitHelper(){
initRetrofit();
}
//声明Retrofit对象
private Retrofit mRetrofit = null;
OkHttpClient client = new OkHttpClient();
//采用单利模式 volatile保证从内存中获取的是最新的
private volatile static RetrofitHelper instance = null;
public static RetrofitHelper getInstance(){
if(instance == null){
synchronized (RetrofitHelper.class){
if (instance == null){
instance = new RetrofitHelper();
}
}
}
return instance;
}
//初始化Retrofit
private void initRetrofit(){
mRetrofit = new Retrofit.Builder()
.baseUrl(UrlConstant.BASE_URL)
.client(client)
.addCo