2014-04-23 4 views
2
I´ve got the following code: 

Observable.timer(AppConstants.SEND_LOCATIONS_INTERVAL_IN_MINUTES, TimeUnit.MINUTES) 
      .observeOn(Schedulers.newThread()) 
      .serialize() 
      .retry() 
      .subscribe(new Action1<Long>() { 
         public void call(Long _) { 
          new SendCoordinatesToServerTask().execute(); 
         } 
        }, 
        new Action1<Throwable>() { 
         public void call(Throwable error) { 
          mLog.error(error, "SEND_LOCATIONS_FAILED",); 
         } 
        }); 


And i get the following error message 

... Exception Ljava/lang/RuntimeException; thrown while initializing Landroid/os/AsyncTask; 

내가 AsyncTask를이 runned도 인스턴스화되지 않는 점에서 키우면 스레딩 문제 (어떤 종류의 쓰레기 수거) 가정 실패합니다. 내가 인스턴스화 AsyncTask를에 대한 참조를 개최하는 경우에만 작동 구독에서 .Execute를를 호출합니다.RxJava : 구독에서 AsyncTask를()를 실행은

논리적 인 일은 사용하지 말아야한다는 것을 알고 있습니다. 서브 스크립 션에 AsyncTask을 사용하면 안됩니다. 재발 성 AsyncTasks에서 마이그레이션하는 과정에있었습니다. 나중에 AsyncTask가 아닌 클래스로 로직을 리팩토링하고 모두 좋다.

왜 처음에는 제대로 작동하지 않았는지 궁금합니다. 비동기 작업이 실행되기 전에 Timer가 종료 되었기 때문입니까? 즉 OnNext이 작업 전에 끝나면 타이머 스레드가 종료됩니다. OnComplete?

하지만 난 정말 원하고 마침내이었다 무슨 짓을했는지 :

CoordinatesToServerSender sender = new CoordinatesToServerSender(); 

Observable.interval(AppConstants.SEND_LOCATIONS_INTERVAL_IN_MINUTES, TimeUnit.MINUTES) 
      .observeOn(Schedulers.newThread()) 
      .serialize() 
      .retry() 
      .subscribe(new Action1<Long>() { 
         public void call(Long _) { 
          sender.execute(); 
         } 
        }, 
         new Action1<Throwable>() { 
          public void call(Throwable error) { 
           mLog.error(error, "SEND_LOCATIONS_FAILED",); 
          } 
         }); 

편집 1 :

나는 당신이 말했듯이 Observable.interval

CoordinatesToServerSender sender = new CoordinatesToServerSender(); 

Observable.interval(AppConstants.SEND_LOCATIONS_INTERVAL_IN_MINUTES, TimeUnit.MINUTES) 
      .retry() 
      .serialize() 
      .subscribe(new Action1<Long>() { 
         public void call(Long _) { 
          sender.execute(); 
         } 
        }, 
         new Action1<Throwable>() { 
          public void call(Throwable error) { 
           mLog.error(error, "SEND_LOCATIONS_FAILED",); 
          } 
         }); 

답변

1

에 대한 중복되는 .observeOn(Schedulers.newThread())을 제거 , AsyncTasks와 RxJava를 혼합하는 것은 이상적입니다. 왜냐하면 당신은 매우 강력한 합성 mec를 가지고 있기 때문입니다. RanJava에서 사용할 수있는 가상 시스템이며 실제로 Observable에 구성하여 (그리고 스케줄러를 사용하여 메인 스레드를 가져옴으로써) 비동기 태스크의 작업을 실제로 실행할 수 있습니다.

하지만이 문제를 해결하기 위해 시도해 본 결과, observeOn(AndroidSchedulers.mainThread())을 해봤습니까? 비동기 스레드가 주 스레드에서 시작될 예정이므로 문제가 될 수 있습니다.