1

私は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コードで

答えて

1

ので

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

、これらは同じものではありません、あなたは内の余分なブラケットを持っていますAndroidロジックは、ストリームロジックを完全に変更します。

、あなたはUIスレッド上でUI関連の操作を実行する必要があるので、あなたは、ストリームをサブスクライブする前にobserveOn(AndroidSchedulers.mainThread())を実行する必要があり、そうでなければ、クラッシュで終わると思います。

+0

コードを書き換えてください。それでも動作しません... –

+1

コピー貼り付けエラーがあります。あなたのJavaコードとAndroidコードは、演算子の順序が異なります。 Javaコードでは 'flatMap()'を行い、この 'flatMap()'の中で 'observeOn()。map()'をやっています。しかし、Androidのコードでは 'flatMap()'と 'map()'をしています。あなたは「今、私はこのコードをAndroidに渡そうとしています」と主張しましたが、それは同じコードではありません。 – azizbekian

+0

確かに、私のエラーです。しかし、まだ私はエラーが発生します。私もgroupBy()の後にobserveOn(AndroidSchedulers.mainThread())を追加しました –

関連する問題