我正在尝试使用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()
将在主线程中启动。
答案 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线程原语,例如ExecutorService
或CompletableFuture
。这是一个例子
Executors.newSingleThreadExecutor()
.execute(new Runnable() {
@Override
public void run() {
startMethod();
onJobFinished(job); //job may need to be final;
}
});
如果以下操作无效,请确认您的服务实际上已被调用。检查您在那里宣布服务的清单。等