前言
内存泄漏问题一直是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) {
}
});
}
}