Android RXJava2 内存性能
Posted
技术标签:
【中文标题】Android RXJava2 内存性能【英文标题】:Android RXJava2 memory performance 【发布时间】:2017-10-15 14:39:11 【问题描述】:我创建了一个 Observable(RxJava2 + Volley),每 5 秒重复一次, 它可以工作,但是当我 Dump Java Heap(memory) 时,我的 Model JAVA 类的实例有很多,并且每次 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;
活动
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));
【问题讨论】:
【参考方案1】:为什么 RX 会为我的模型创建多个实例?我怎样才能只使用它的一个实例?
如果你仔细看堆转储中的对象是LiveRemoteModel$2
,这表明它是LiveRemoteModel
中的一个匿名类。
查看您的代码,这可能是每次调用 model.getLiveRefreshFuture()
时创建的 VolleyStringRequest
对象。在 RX 管道中没有保留该对象,因此 Volley 中必须有某些东西保留它。
【讨论】:
这可能对我将所有局部变量转换为 WeakReference 并且我安装 LeakCanary 库以监视内存泄漏的人有用。至少现在一切正常。并且 LiveRemoteModel 的所有实例在 GC 事件 后立即释放以上是关于Android RXJava2 内存性能的主要内容,如果未能解决你的问题,请参考以下文章
Android Annotation注解RxJava开源网络库