Android AutoDispose 防止RxJava内存泄漏

前言

内存泄漏问题一直是android开发的一个大问题,RxJava已经深入人心,但是RxJava的使用不当会导致内存泄漏。RxJava本是一个减少我们代码量,方便我们使用的一个库。但是由于我们要解决内存泄漏,就变得麻烦起来。那本来一个简单方便的东西,又要由于其他的处理变得麻烦,叫人恶心。之前有一个RxLiycycle库来进行内存管理,但是这个并不完美,在Github上也可以看出它的做者也更倾向于AutoDispose,AutoDispose这个库也有RxLicycle作者的贡献。而且本博客的作者也习惯使用了AutoDispose,并且一直在使用着,本篇博客只教会如何使用AutoDispose

本篇博客的Demo可以查看码云

https://gitee.com/song_cn/AutoDispose





一、添加依赖

由于是解决RxJava的内存泄漏,所以依赖着里不仅导入了AutoDispose,还添加了RxJava和Retrofit

    api 'com.squareup.okhttp3:logging-interceptor:3.5.0'
    api 'com.squareup.retrofit2:retrofit:2.3.0'
    api 'com.squareup.retrofit2:converter-gson:2.3.0'
    api 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
    api 'io.reactivex.rxjava2:rxjava:2.2.8'
    api 'io.reactivex.rxjava2:rxandroid:2.1.1'
    //AutoDispose解决RXJava内存泄漏
    api 'com.uber.autodispose:autodispose:0.7.0'
    api 'com.uber.autodispose:autodispose-android:0.7.0'
    api 'com.uber.autodispose:autodispose-android-archcomponents:0.7.0'

二、代码

这里的RxJava是我从上一篇封装Retrofit+RxJava中copy来的,如果其中有不明白,可以查看上篇文章

https://blog.csdn.net/qq_36721053/article/details/90212189

首先为了规范性,这里封装了AutoDispose工具类

package com.song.autodispose.util;

import android.arch.lifecycle.Lifecycle;
import android.arch.lifecycle.LifecycleOwner;

import com.uber.autodispose.AutoDispose;
import com.uber.autodispose.AutoDisposeConverter;
import com.uber.autodispose.android.lifecycle.AndroidLifecycleScopeProvider;

public class RxLifecycleUtils {
    private RxLifecycleUtils() {
        throw new IllegalStateException("Can't instance the RxLifecycleUtils");
    }

    public static <T> AutoDisposeConverter<T> bindLifecycle(LifecycleOwner lifecycleOwner) {
        return AutoDispose.autoDisposable(AndroidLifecycleScopeProvider.from(lifecycleOwner, Lifecycle.Event.ON_DESTROY));
    }
}

下面是使用时候的正确方式,注意AutoDispose不可以在子线程绑定生命周期

package com.song.autodispose;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import com.song.autodispose.callback.RequestCallBack;
import com.song.autodispose.net.RetrofitServiceManager;
import com.song.autodispose.net.TestService;
import com.song.autodispose.rx.ResultFilter;
import com.song.autodispose.rx.RxScheduler;
import com.song.autodispose.util.RxLifecycleUtils;

import java.util.Map;

import io.reactivex.disposables.Disposable;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        RetrofitServiceManager.getInstance().create(TestService.class)
                .getResourceClassificationStatistic()
                .map(new ResultFilter<Map<String, Map<String, String>>>())
                .compose(RxScheduler.<Map<String, Map<String, String>>>ioMain())
                .as(RxLifecycleUtils.<Map<String, Map<String, String>>>bindLifecycle(this))//此处为防止内存泄漏的解决方法
                .subscribe(new RequestCallBack<Map<String, Map<String, String>>>(this) {
                    @Override
                    public void onBefore(Disposable d) {

                    }

                    @Override
                    public void onSuccess(Map<String, Map<String, String>> data) {

                    }
                });
    }
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值