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

Если следующее не работает, убедитесь, что ваша служба действительно вызывается. Проверьте свой манифест, что вы объявили там свою службу. так далее

Другие вопросы по тегам