如何使用RxJava2使用IntentService线程

时间:2018-01-20 12:46:58

标签: android rx-java2 intentservice

我面对下一个情况。我在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!

我的日志是:

  • IntentService线程
  • IntentService线程响应正文
  • IntentService线程getInfoAboutUser
  • RxSingleScheduler-1执行者线程
  • RxSingleScheduler-1结果

如何为Observable.zip和Interval方法使用IntentService线程?我只需要IntentService线程

1 个答案:

答案 0 :(得分:1)

Schedulers.from(e)Executor打包在内部类ExecutorScheduler中。如果任务被安排延迟且给定的Executor不是ScheduledExecutorService,那么它将使用内部调度程序将调用延迟到e.execute(),直到延迟结束。

因为执行程序只是立即执行,它最终会在帮助程序调度程序RxSingleScheduler-1上执行。

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

  1. 创建一个ScheduledExecutorService,正确地将runnables分派到IntentService
  2. 创建一个自定义Scheduler,将runnables分发到IntentService Looper
  3. 使用RxAndroid库为您执行2. AndroidSchedulers.from(Looper.myLooper())将为IntentService
  4. 创建一个调度程序

    修改:请注意IntentService和异步操作不要混合。该服务将在handleIntent返回时终止,因此它不是好事 执行Observable.interval等延迟操作的方法。