优雅的Android的MVP架构Retrofit2+Rxjava2,避免内存泄漏问题

文章的代码是来源于郭子轩,地址是: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()
  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值