Android 如何使用RxJava2使用IntentService线程
我面临着下一种情况。我在onHadleIntent方法中启动代码,代码的一部分在IntentService线程中工作,但getInfoAboutUser()中的Observable.zip方法在RxJava线程中工作Android 如何使用RxJava2使用IntentService线程,android,rx-java2,intentservice,Android,Rx Java2,Intentservice,我面临着下一种情况。我在onHadleIntent方法中启动代码,代码的一部分在IntentService线程中工作,但getInfoAboutUser()中的Observable.zip方法在RxJava线程中工作 @Override protected void onHandleIntent(@Nullable Intent intent) { LOG.debug(Thread.currentThread().getName()); Call<String&g
@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>() {})
}
@覆盖
受保护的无效onHandleIntent(@Nullable Intent){
LOG.debug(Thread.currentThread().getName());
Call Call=mRepository.getInfo();
试一试{
2.Response-Response=call.execute();
if(response.issusccessful()){
调试(“响应体”+线程.currentThread().getName());
getInfoAboutUser();
}
}catch(){}
}
public void getInfoAboutUser(){
debug(“getInfoAboutUser”+Thread.currentThread().getName());
执行者e=新执行者(){
@凌驾
public void execute(@NonNull Runnable Runnable){
调试(“执行线程”);
runnable.run();
}
};
可观察的.zip(
可观测的。从可观测的(数组),
可观察
.间隔时间((m兰多姆·奈克斯汀(7)+5)*1000,
时间单位。毫秒,调度程序。从(e))
.take(array.size()),
新的双函数(){
@凌驾
公共字符串apply(字符串s,长)引发异常{
LOG.debug(“结果”+Thread.currentThread().getName());
返回s;
}
}
).flatmapmaybay(新函数(){
@凌驾
公共MaybeSource apply(字符串s)引发异常{
返回mRepository.getInfoAboutUser;
}
}).subscribowith(新的DisposableObserver(){})
}
mRepository.getInfo()和mRepository.getInfoAboutUser方法我在没有subscribeOn和observeOn的情况下使用
我的日志是:
- IntentService线程
- IntentService线程响应体
- IntentService线程getInfoAboutUser
- RxSingleScheduler-1执行器线程
- RxSingleScheduler-1结果
调度程序。从(e)
将执行器
包装在内部类执行器调度程序
中。如果任务被延迟调度,并且给定的执行器
不是ScheduledExecutorService
,则它将使用内部调度程序延迟对e.execute()
的调用,直到延迟完成
因为您的执行器只是立即执行,所以它最终在助手调度器上执行,即RxSingleScheduler-1
要解决此问题,您需要从以下解决方案中进行选择:
ScheduledExecutorService
,它将可运行文件正确地分派给IntentService
计划程序
,该计划程序将可运行程序分派给IntentService
的活套
AndroidSchedulers.from(Looper.myLooper())
将为IntentService
创建一个调度程序IntentService
和异步操作不能混合使用。当HandleContent
返回时,服务将终止,因此它不是一个好服务
执行延迟操作的方法,如
可观察。间隔
完美的解释。如果需要长时间操作,您能解释一下如何解决这个问题吗?如何执行一项任务?我可以使用looper=looper.myLooper()获取intentService循环器,然后我可以使用looper线程looper.getThread()或thread.currentThread()获取循环器线程,但是如何将此线程绑定到ScheduledExecutorService?我在interval方法中添加了一个AndroidSchedulers.from(looper.myLooper())但是这个项目不起作用。interval方法不起作用,也不会产生错误。就像我说的,IntentService在HandleContent
方法返回后关闭,这包括它管理的活套。这意味着计划的间隔被取消。