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) {

                    }
                });
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章