带有RxJava2的Firebase.jobdispatcher不能异步工作

时间:2018-01-17 13:24:57

标签: android firebase rx-java2 firebase-job-dispatcher

我正在尝试使用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()将在主线程中启动。

2 个答案:

答案 0 :(得分:1)

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

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

        }
    });

答案 1 :(得分:1)

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

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

如果以下操作无效,请确认您的服务实际上已被调用。检查您在那里宣布服务的清单。等