带有 RxJava2 的 Firebase.jobdispatcher 无法异步工作



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

我认为您的问题可能出在observeOn语句中。我尝试复制您拥有的代码。但是由于我假设您没有尝试更新 UI 线程,因此删除observeOn将允许该过程在Schedulers.io()创建的RxCachedScheduler线程上完成,并且不会阻止 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) {
}
});

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

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

如果以下方法不起作用,请确认您的服务确实正在被调用。检查清单,确认您已在此处声明服务。等

相关内容

  • 没有找到相关文章

最新更新