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开源网络库

Rxjava2 Observable的布尔操作符详解及实例

知识整理这可能是最好的RxJava 2.x 入门教程

retrofit2+MVP+rxjava2+rxlifecycle2 为啥无法解决内存泄露

Android实战——RxJava2解锁图片三级缓存框架

Android实战——RxJava2+Retrofit+RxBinding解锁各种新姿势