Firebase.jobdispatcher с RxJava2 не работает асинхронно
Я пытаюсь запустить Firebase jobdispatcher асинхронно с использованием RxJava2.
@Override
public boolean onStartJob(JobParameters job) {
Completable.fromAction(new Action() {
@Override
public void run() throws Exception {
startMethod();
}
}).subscribeOn(mSchedulerProvider.io())
.observeOn(mSchedulerProvider.mainThread())
.subscribeWith(new DisposableCompletableObserver() {
@Override
public void onComplete() {
LOG.debug("onComplete");
onStopJob(job);
}
@Override
public void onError(Throwable e) {
}
});
return true;
}
@Override
public boolean onStopJob(JobParameters job) {
LOG.debug("stop job");
return true;
}
Когда я добавил subscribeOn(mSchedulerProvider.io())
выровнять startMethod()
не запускается, если я удалю эту строку startMethod()
начинается в главной теме.
2 ответа
Я думаю, что ваша проблема может быть в observeOn
заявление. Я попытался повторить код, который у вас есть. Но так как я предполагаю, что вы не пытаетесь обновить поток пользовательского интерфейса, удаление observeOn
позволит завершить процесс на RxCachedScheduler
что нить Schedulers.io()
создает и не будет блокировать пользовательский интерфейс
Completable.fromAction(new Action() {
@Override
public void run() throws Exception {
Log.e("RXJAVA","Running on | " + Thread.currentThread().getName());
startMethod();
}
})
.subscribeOn(Schedulers.io())
// .observeOn(AndroidSchedulers.mainThread()) //Try comment this out
//also try subscribe instead of subscribeWith
.subscribe(new DisposableCompletableObserver() {
@Override
public void onComplete() {
System.err.println("RXJAVA onComplete | " + Thread.currentThread().getName());
Log.e("RXJAVA","onComplete | " + Thread.currentThread().getName());
}
@Override
public void onError(Throwable e) {
}
});
Я думаю, что проблема может быть связана с самим RxJava Попробуйте заменить ваш код этим. Я бы посоветовал просто использовать простой примитив потоков Java, например ExecutorService
или же CompletableFuture
, Вот пример
Executors.newSingleThreadExecutor()
.execute(new Runnable() {
@Override
public void run() {
startMethod();
onJobFinished(job); //job may need to be final;
}
});
Если следующее не работает, убедитесь, что ваша служба действительно вызывается. Проверьте свой манифест, что вы объявили там свою службу. так далее