私はRxJavaで小さなJavaプログラムを正常に実行しました。コードは:Android RxJavaの並列化 - ExecutorServiceによる計算
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);
メソッド内(finishedListenerは、現在の活動を実施しているインタフェースである)私は、GUIを更新しています)(終了。私が使用しています(アプリ用)build.gradleで
no instance(s) of type variable(s) exist so that void conforms to R
:
compile 'io.reactivex:rxjava:1.2.9'
- (> intenseCalculation(I)は、i)
私はマップとライン上のエラーを取得しています
どうすれば問題を解決できますか?
.flatMap(g -> g.observeOn(scheduler)
.map(i -> intenseCalculation(i))
)
しかし、Androidのコードでは、メインストリームにmap()
を実行している:あなたが持っているJavaコードで
コードを書き換えてください。それでも動作しません... –
コピー貼り付けエラーがあります。あなたのJavaコードとAndroidコードは、演算子の順序が異なります。 Javaコードでは 'flatMap()'を行い、この 'flatMap()'の中で 'observeOn()。map()'をやっています。しかし、Androidのコードでは 'flatMap()'と 'map()'をしています。あなたは「今、私はこのコードをAndroidに渡そうとしています」と主張しましたが、それは同じコードではありません。 – azizbekian
確かに、私のエラーです。しかし、まだ私はエラーが発生します。私もgroupBy()の後にobserveOn(AndroidSchedulers.mainThread())を追加しました –