Android RxJava并行化 - 使用ExecutorService进行计算

时间:2017-04-18 12:19:45

标签: android concurrency rx-java reactive-programming rx-android

我用RxJava成功完成了一个小型Java程序。代码是:

    public static void main( String[] args ) {
        int threadCt = Runtime.getRuntime().availableProcessors() + 1;
        //multi-threading
        ExecutorService executor = Executors.newFixedThreadPool(threadCt);
        Scheduler scheduler = Schedulers.from(executor);

        final AtomicInteger batch = new AtomicInteger(0);

        Observable.range(1,80)
            .groupBy(i -> batch.getAndIncrement() % threadCt )
            .flatMap(g -> g.observeOn(scheduler)
                    .map(i -> intenseCalculation(i))
            ).subscribe(System.out::println);
    }



    public static int intenseCalculation(int i) {
       try {
          System.out.println("Calculating " + i +
                " on " + Thread.currentThread().getName());
          Thread.sleep(500);
          return i;
       } catch (InterruptedException e) {
        throw new RuntimeException(e);
       }
    }

使用此代码一切正常。现在我试图将此代码传递给Android:

        Scheduler scheduler = Schedulers.from(executor);

        final AtomicInteger batch = new AtomicInteger(0);
        Observable.range(0, copiedCategories.size() - 1)
                .groupBy(i -> batch.getAndIncrement() % threadCt)
                .flatMap(g -> g.observeOn(scheduler))
                .map(i -> intenseCalculation(i))
                .subscribe(finishedListener::finished);

在方法内部()我正在更新GUI(finishedListener是当前Activity正在实现的接口)。

我在地图上遇到错误(i - > intenseCalculation(i)):

no instance(s) of type variable(s) exist so that void conforms to R

在我使用的build.gradle(对于app)中:

compile 'io.reactivex:rxjava:1.2.9'

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

在java代码中你有:

.flatMap(g -> g.observeOn(scheduler)
               .map(i -> intenseCalculation(i))
        )

但在Android代码中,您在主流上执行map()

.flatMap(g -> g.observeOn(scheduler))
.map(i -> intenseCalculation(i))

所以,这些不是一回事,你在Android代码中有额外的括号,这完全改变了流逻辑。

注意,您应该在UI线程上执行与UI相关的操作,因此您必须在订阅流之前执行observeOn(AndroidSchedulers.mainThread()),否则您最终会崩溃。< / p>