【问题标题】:Android RXJava2 memory performanceAndroid RXJava2 内存性能
【发布时间】: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));    

【问题讨论】:

    标签: android heap-memory rx-java2


    【解决方案1】:

    为什么 RX 会为我的模型创建多个实例?我怎样才能只使用它的一个实例?

    如果你仔细看堆转储中的对象是LiveRemoteModel$2,这表明它是LiveRemoteModel中的一个匿名类。

    查看您的代码,这可能是每次调用 model.getLiveRefreshFuture() 时创建的 VolleyStringRequest 对象。在 RX 管道中没有保留该对象,因此 Volley 中必须有某些东西保留它。

    【讨论】:

    • 这可能对我将所有局部变量转换为 WeakReference 并且我安装 LeakCanary 库以监视内存泄漏的人有用。至少现在一切正常。并且 LiveRemoteModel 的所有实例在 GC 事件 后立即释放
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-26
    • 1970-01-01
    • 1970-01-01
    • 2010-11-10
    • 2010-09-13
    相关资源
    最近更新 更多