gpt4 book ai didi

Android RxJava 并行化——用 ExecutorService 计算

转载 作者:行者123 更新时间:2023-11-30 00:35:29 25 4
gpt4 key购买 nike

我已经用 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);

在 finished() 方法中,我正在更新 GUI(finishedListener 是当前 Activity 正在实现的接口(interface))。

我在 map(i -> intenseCalculation(i)) 的行上遇到错误:

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

在 build.gradle(对于应用程序)中,我正在使用:

compile 'io.reactivex:rxjava:1.2.9'

我该如何解决这个问题?

最佳答案

在 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()),否则你最终会陷入崩溃。

关于Android RxJava 并行化——用 ExecutorService 计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43471961/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com