Rxjava在Android开发中使用已经是老生常谈了,但如果使用不当会导致内存泄露
比如,使用RxJava发布一个订阅后,当Activity被finish,此时订阅逻辑还未完成,如果没有及时取消订阅,就会导致Activity无法被回收,从而引发内存泄漏。
这里推荐一个开源库RxLifecycle
,通过监听Activity、Fragment的生命周期,来自动断开subscription以防止内存泄露
那么如何使用呢
1、添加依赖
在build.gradle中添加以下依赖
implementation 'com.trello.rxlifecycle2:rxlifecycle:2.2.2'
// If you want to bind to Android-specific lifecycles
implementation 'com.trello.rxlifecycle2:rxlifecycle-android:2.2.2'
// If you want pre-written Activities and Fragments you can subclass as providers
implementation 'com.trello.rxlifecycle2:rxlifecycle-components:2.2.2'
2.配置Activity、Fragment
Activity/Fragment继承RxAppCompatActivity/RxFragment,一般在开发中都是BaseActivity/BaseFragment来分别继承这两个类。
当然RxLifecycle还支持其他更多的组件
3、使用compose操作符绑定容器生命周期
这里推荐用MVP模式来绑定生命周期,代码如下:
public interface BaseContract {
interface BasePresenter<T extends BaseContract.BaseView> {
void attachView(T view);
void detachView();
}
interface BaseView {
//显示进度中
void showLoading();
//隐藏进度
void hideLoading();
//显示请求成功
void showSuccess(String message);
//失败重试
void showFaild(String message);
//显示当前网络不可用
void showNoNet();
//重试
void onRetry();
/**
* 绑定生命周期
*
* @param <T>
* @return
*/
<T> LifecycleTransformer<T> bindToLife();
}
}
4.使用操作
下面使用登录的代码来做个例子:
public class LoginPresenter extends BasePresenter<LoginContract.View> implements LoginContract.Presenter {
@Inject
public LoginPresenter() {
}
@Override
public void login(String username, String password) {
RetrofitManager.create(ApiService.class)
.login(username, password)
.compose(RxSchedulers.<DataResponse<User>>applySchedulers())
.compose(mView.<DataResponse<User>>bindToLife())
.subscribe(new Consumer<DataResponse<User>>() {
@Override
public void accept(DataResponse<User> response) throws Exception {
if (response.getErrorCode() == 0) {
mView.loginSuccess(response.getData());
} else {
mView.showFaild(String.valueOf(response.getErrorMsg()));
}
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
mView.showFaild(throwable.getMessage());
}
});
}
}
好吧,使用起来就是这么简单,不过目前似乎有大神研究出了更好的Rxjava内存泄露解决方案,有兴趣的可以自行了解下