2016-08-16 3 views
1

Observableが存在し、非常に大きな(10,000以上の)要素のシーケンスを生成すると仮定します。この観察可能なスレッドはバックグラウンドスレッドで動作し、結果をUIスレッドに渡します。ここで、RecyclerViewアダプタは各文字列を追加します。Android、RX:UIスレッドには何がありますか - コレクションまたは要素ですか?

    自体の観察可能で
  1. (EMITないコレクションが、ストリング)、ワーカースレッド上で一般に 、別の文字列にリストのそれぞれを分割する2つのアプローチが存在します。
  2. サブスクライバでは、UIスレッドです。

最初のケースでは、UIが少し仕事をします。 応答性 しかし、オーバーヘッドによりスレッド間で各文字列を転送するため、データ処理の全体的な時間も大幅に伸び、アプリケーションのパフォーマンスが低下する可能性があります。

どのようなアプローチが望ましいと思いますか?

例コード。

アプローチ1、バックグラウンドスレッドでの処理データ:

Observable.create(subscriber -> { // Data is transferred from background to UI thread 10,000 times. for (int i = 0; i < 10000; i++) subscriber.onNext("String " + i); }) .observeOn(AndroidSchedulers.mainThread()) .subscribeOn(Schedulers.newThread()) .subscribe(data -> RecyclerView.Adapter adapter = ...; // UI holds for processing just one string. adapter.add(data); });

アプローチ2、UIスレッド上の処理データ:

Observable.create(subscriber -> { Collection<String> data = new ArrayList<>(); for (int i = 0; i < 10000; i++) data.add("String " + i); // Data transfers from background to UI thread only once subscriber.onNext(data); }) .observeOn(AndroidSchedulers.mainThread()) .subscribeOn(Schedulers.newThread()) .subscribe(data -> { RecyclerView.Adapter adapter = ...; // Long operation, UI waits until all 10,000 element will be processed. for (String e : data) adapter.add(e); });

+0

私は2つの異なるアプローチがどのように見えるかわかりません。コードを追加できますか?私は通常ちょうど私の加入者は、リストに取るデータセットが変更されたことを通知し、私はあなたのオプション2が何を信じているrecyclerviewを、再移入adapter.swapItems(リスト)を呼び出しています。 私はあなたがオプション1 – AdamMc331

+0

追加のために想像しているかわからないんだけど、たとえばコードを来ります。 – Alexey

答えて

0

だけのテストと実際のために良い作品かを決めますあなた(いつものように、私たちが演奏する時)。私はあなたが2つの変種に自分自身を制限しないようにアドバイスします。中間のバリアントが10-100文字列のアダプターブロックに渡ることも考慮してください。

2

IMHO私は3番目のアプローチを採用します。

stringsObservable.buffer(1, TimeUnit.SECONDS) 
    .subscribeOn(Schedulers.newThread) 
    .observeOn(AndroidSchedulers.mainThread) 
    .subscribe(adapter::addAll) 

バッファリングする理由は、それはあなたが速いあなたがrecyclerView作る失敗する項目を追加です。 バッファの時間、またはより単純なバッファ(nItems)を使用してチューニングするものです。