2017-05-16 1 views
-1

내가 각 5 초 동안 반복 피 감시 (RxJava2 + 발리)을 생성,
그것은 작동하지만 내가 자바 힙 (메모리) 덤프 때, 내 모델 자바 클래스의 여러 인스턴스가 Observable이 반복 될 때마다 증가 할 것입니다.
RX가 내 모델의 여러 인스턴스를 만드는 이유는 무엇입니까? 하나의 인스턴스 만 사용하려면 어떻게해야합니까?
안드로이드 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의 CREA 내 모델의 여러 인스턴스? 하나의 인스턴스 만 사용하려면 어떻게해야합니까?

힙 덤프의 개체는 LiveRemoteModel$2이며 익명 클래스 인 LiveRemoteModel임을 나타냅니다.

코드를 보면 model.getLiveRefreshFuture()이 호출 될 때마다 생성되는 VolleyStringRequest 개체 일 것입니다. RX 파이프 라인 내에 그 객체를 유지하는 것이 아무것도 없으므로 Volley 내에 그것을 유지하는 무언가가 있어야합니다.

+0

아마도 누군가에게 유용 할 것입니다. 모든 로컬 변수를 ** WeakReference **로 변환하고 ** LeakCanary ** 라이브러리를 설치하여 메모리 누출을 모니터링합니다. 적어도 이제는 모든 것이 OK입니다. 그리고 * LiveRemoteModel *의 모든 인스턴스는 GC- 이벤트 – saeid