Rxjava在Android開發(fā)中使用已經(jīng)是老生常談了累贤,但如果使用不當(dāng)會導(dǎo)致內(nèi)存泄露
比如叠穆,使用RxJava發(fā)布一個訂閱后少漆,當(dāng)Activity被finish臼膏,此時訂閱邏輯還未完成,如果沒有及時取消訂閱示损,就會導(dǎo)致Activity無法被回收渗磅,從而引發(fā)內(nèi)存泄漏。
這里推薦一個開源庫RxLifecycle
,通過監(jiān)聽Activity检访、Fragment的生命周期始鱼,來自動斷開subscription以防止內(nèi)存泄露
那么如何使用呢
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,一般在開發(fā)中都是BaseActivity/BaseFragment來分別繼承這兩個類医清。
當(dāng)然RxLifecycle還支持其他更多的組件
rxlifecycle.png
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);
//顯示當(dāng)前網(wǎng)絡(luò)不可用
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內(nèi)存泄露解決方案,有興趣的可以自行了解下