Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/224.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何使用RxJava2使用IntentService线程_Android_Rx Java2_Intentservice - Fatal编程技术网

Android 如何使用RxJava2使用IntentService线程

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

我面临着下一种情况。我在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>() {})
}
@覆盖
受保护的无效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结果

对于Observable.zip和Interval方法,我应该如何使用IntentService线程?我只需要IntentService线程

调度程序。从(e)
执行器
包装在内部类
执行器调度程序
中。如果任务被延迟调度,并且给定的
执行器
不是
ScheduledExecutorService
,则它将使用内部调度程序延迟对
e.execute()
的调用,直到延迟完成

因为您的执行器只是立即执行,所以它最终在助手调度器上执行,即
RxSingleScheduler-1

要解决此问题,您需要从以下解决方案中进行选择:

  • 创建一个
    ScheduledExecutorService
    ,它将可运行文件正确地分派给
    IntentService
  • 创建一个自定义的
    计划程序
    ,该计划程序将可运行程序分派给
    IntentService
    活套
  • 使用库执行2。给你
    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
    方法返回后关闭,这包括它管理的活套。这意味着计划的间隔被取消。