2017-05-16 9 views
-1

は、私は各5秒間繰り返し観察可能(RxJava2 +ボレー)を作成し、
は、それは動作しますが、私は Javaヒープ(メモリ)をダンプとき、私のモデル JAVAクラスの多くのインスタンスがありますObservableが繰り返されるたびに増加します。
RXが私のモデルのいくつかのインスタンスを作成するのはなぜですか?どのようにして1つのインスタンスだけを使用できますか?
アンドロイドRXJava2はメモリ性能

モデル

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));  

Memory Dump

答えて

0

なぜRXクレア私のモデルのいくつかのインスタンス?どのようにして1つのインスタンスだけを使用できますか?あなたは慎重に見ると

heapdump内のオブジェクトは、それがLiveRemoteModel内の匿名クラスであることを示しLiveRemoteModel$2です。

あなたのコードを見ると、model.getLiveRefreshFuture()が呼び出されるたびに作成されるVolleyStringRequestオブジェクトになっている可能性があります。そのオブジェクトをRXパイプライン内に保持するものは何もないので、それを保持する何かがバレー内になければならない。

+0

誰かにとって役に立つかもしれない 私はすべてのローカル変数を** WeakReference **に変換し、** LeakCanary **ライブラリをインストールしてメモリリークを監視します。 少なくとも今はすべてOKです。そして、* LiveRemoteModel *のすべてのインスタンスは、GCイベント – saeid

関連する問題