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",);
}
});