Android RXJava2 内存性能
Android RXJava2 memory performance
我创建了一个每 5 秒重复一次的 Observable(RxJava2 + Volley),
它有效,但是当我 Dump Java 堆(内存)时,我的 Model JAVA [= 有很多实例36=],每次 Observable 重复时它都会增加。
为什么 RX 创建我的模型的多个实例?我怎样才能只使用它的一个实例?
型号
public RequestFuture<String> getLiveRefreshFuture() {
RequestFuture<String> future = RequestFuture.newFuture();
VolleyStringRequest request = new VolleyStringRequest(Request.Method.POST
, REFRESH_URL
, future
, future) {
@Override
protected Map<String, String> getParams() throws AuthFailureError {
return getRefreshParams();
}
};
VolleySingleton.getInstance().addToRequestQueue(request);
return future;
}
Activity
private final CompositeDisposable disposables = new CompositeDisposable();
final LiveRemoteModel model = DaggerLiveComponent.builder().build().getModel();
Observable<LiveResponse> observable = Observable
.interval(Constants.TOOLBAR_BADGES_REFRESH_DELAY, TimeUnit.SECONDS)
.subscribeOn(Schedulers.io())
.map(dummy -> model.getLiveRefreshFuture())
.map(RequestFuture::get)
.map(LiveResponse::new)
.observeOn(AndroidSchedulers.mainThread());
DisposableObserver<LiveResponse> disposableObserver =
new DisposableObserver<LiveResponse>() {
@Override
public void onNext(@NonNull LiveResponse liveResponse) {
setToolbarBadges(liveResponse.getToolbarBadges());
}
public void onError(@NonNull Throwable e) {
Log.e("RX", "onError: ", e);
}
@Override
public void onComplete() {
Log.d("RX", "onComplete: ");
}
};
disposables.add(observable.subscribeWith(disposableObserver));
Why RX create several instance of my model? How can I use only ONE instance of it?
如果你仔细看,heapdump 中的对象是 LiveRemoteModel
,这表明它是 LiveRemoteModel
.
中的匿名 class
查看您的代码,这可能是每次调用 model.getLiveRefreshFuture()
时创建的 VolleyStringRequest
对象。 RX 管道中没有保留该对象,因此 Volley 中必须有某些东西保留它。
我创建了一个每 5 秒重复一次的 Observable(RxJava2 + Volley),
它有效,但是当我 Dump Java 堆(内存)时,我的 Model JAVA [= 有很多实例36=],每次 Observable 重复时它都会增加。
为什么 RX 创建我的模型的多个实例?我怎样才能只使用它的一个实例?
型号
public RequestFuture<String> getLiveRefreshFuture() {
RequestFuture<String> future = RequestFuture.newFuture();
VolleyStringRequest request = new VolleyStringRequest(Request.Method.POST
, REFRESH_URL
, future
, future) {
@Override
protected Map<String, String> getParams() throws AuthFailureError {
return getRefreshParams();
}
};
VolleySingleton.getInstance().addToRequestQueue(request);
return future;
}
Activity
private final CompositeDisposable disposables = new CompositeDisposable();
final LiveRemoteModel model = DaggerLiveComponent.builder().build().getModel();
Observable<LiveResponse> observable = Observable
.interval(Constants.TOOLBAR_BADGES_REFRESH_DELAY, TimeUnit.SECONDS)
.subscribeOn(Schedulers.io())
.map(dummy -> model.getLiveRefreshFuture())
.map(RequestFuture::get)
.map(LiveResponse::new)
.observeOn(AndroidSchedulers.mainThread());
DisposableObserver<LiveResponse> disposableObserver =
new DisposableObserver<LiveResponse>() {
@Override
public void onNext(@NonNull LiveResponse liveResponse) {
setToolbarBadges(liveResponse.getToolbarBadges());
}
public void onError(@NonNull Throwable e) {
Log.e("RX", "onError: ", e);
}
@Override
public void onComplete() {
Log.d("RX", "onComplete: ");
}
};
disposables.add(observable.subscribeWith(disposableObserver));
Why RX create several instance of my model? How can I use only ONE instance of it?
如果你仔细看,heapdump 中的对象是 LiveRemoteModel
,这表明它是 LiveRemoteModel
.
查看您的代码,这可能是每次调用 model.getLiveRefreshFuture()
时创建的 VolleyStringRequest
对象。 RX 管道中没有保留该对象,因此 Volley 中必须有某些东西保留它。