我用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'
我该如何解决这个问题?
答案 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>