我面对下一个情况。我在onHadleIntent方法中启动我的代码,部分代码在IntentService线程中工作,但getInfoAboutUser()中的Observable.zip方法在RxJava线程中工作。
@Override
protected void onHandleIntent(@Nullable Intent intent) {
LOG.debug(Thread.currentThread().getName());
Call<String> call= mRepository.getInfo();
try {
retrofit2.Response<String> response = call.execute();
if (response.isSuccessful()) {
LOG.debug("Response body "+Thread.currentThread().getName());
getInfoAboutUser();
}
}catch(){}
}
public void getInfoAboutUser(){
LOG.debug("getInfoAboutUser "+Thread.currentThread().getName());
Executor e = new Executor() {
@Override
public void execute(@NonNull Runnable runnable) {
LOG.debug(" executor thread");
runnable.run();
}
};
Observable.zip(
Observable.fromIterable(array),
Observable
.interval((mRandom.nextInt(7)+5) * 1000,
TimeUnit.MILLISECONDS,Schedulers.from(e))
.take(array.size()),
new BiFunction<String, Long, String>() {
@Override
public String apply(String s, Long aLong) throws Exception {
LOG.debug("Result "+Thread.currentThread().getName());
return s;
}
}
).flatMapMaybe(new Function<String, MaybeSource<String>>() {
@Override
public MaybeSource<String> apply(String s) throws Exception {
return mRepository.getInfoAboutUser(s);
}
}).subscribeWith(new DisposableObserver<String>() {})
}
我正在使用的mRepository.getInfo()和mRepository.getInfoAboutUser(s)方法没有subscribeOn和observeOn!
我的日志是:
等
如何为Observable.zip和Interval方法使用IntentService线程?我只需要IntentService线程
答案 0 :(得分:1)
Schedulers.from(e)
将Executor
打包在内部类ExecutorScheduler
中。如果任务被安排延迟且给定的Executor
不是ScheduledExecutorService
,那么它将使用内部调度程序将调用延迟到e.execute()
,直到延迟结束。
因为执行程序只是立即执行,它最终会在帮助程序调度程序RxSingleScheduler-1
上执行。
要解决此问题,您需要从以下解决方案中进行选择:
ScheduledExecutorService
,正确地将runnables分派到IntentService
。Scheduler
,将runnables分发到IntentService
Looper
。AndroidSchedulers.from(Looper.myLooper())
将为IntentService
。修改:请注意IntentService
和异步操作不要混合。该服务将在handleIntent
返回时终止,因此它不是好事
执行Observable.interval
等延迟操作的方法。