我正在尝试使用 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 线程原语,例如ExecutorService
或CompletableFuture
.下面是一个示例
Executors.newSingleThreadExecutor()
.execute(new Runnable() {
@Override
public void run() {
startMethod();
onJobFinished(job); //job may need to be final;
}
});
如果以下方法不起作用,请确认您的服务确实正在被调用。检查清单,确认您已在此处声明服务。等