1

我正在尝试使用 RxJava2 异步启动 Firebase jobdispatcher。

@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()在主线程中开始。

4

2 回答 2

1

我认为问题可能来自 RxJava 本身尝试用这个替换你的代码。我建议只使用一个简单的 Java 线程原语,例如ExecutorServiceCompletableFuture. 这是一个例子

Executors.newSingleThreadExecutor()
            .execute(new Runnable() {
                @Override
                public void run() {
                    startMethod();
                    onJobFinished(job); //job may need to be final;
                }
            });

如果以下方法不起作用,请确认您的服务实际上正在被调用。检查你的清单,你已经在那里声明了你的服务。ETC

于 2018-01-18T10:19:01.680 回答
1

我认为您的问题可能在observeOn声明中。我尝试复制您拥有的代码。但是由于我假设您没有尝试更新 UI 线程,因此删除observeOn将允许进程RxCachedScheduler在创建的线程上完成Schedulers.io()并且不会阻塞 UI

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) {

        }
    });
于 2018-01-17T14:08:10.353 回答