2017-10-23 6 views
6

こんにちは、私はrxjava2について基本的には非同期操作用です。私はそれがアンドロイドのAsyncTaskでないオペレータのコンセプトを持っていることがわかりました。RxJava2の優位性AsyncTask

他の方法はrxjava2AsyncTaskとは異なりますか?

+1

@VygintasBサブスクリプションを適切に処理しないと、メモリリークが発生し、そうでないと誤解する可能性があり、誤った比較が行われる可能性があります。 –

+2

私はOPの答えをdownvotingでポイントが表示されません。 @ BobDalgeishの答えは、初心者の混乱を和らげるためにアップをするべきです。 – Solidak

答えて

12

RxJavaは「基本的に非同期操作」ではありません。それはそれのただ一つの側面です。

  1. RxJavaでは、1つの操作の出力を次への入力として使用できるように、データの操作を作成できます。これは、ストリームの実装と同様に動作します。
  2. RxJavaはこの合成機能を使用して、マルチスレッド環境でいくつかの操作を実行できるようにします。これは、複数のスケジューラを扱う際に、オペレータに明確なセマンティクスを提供することで実現します。 RxJavaはasyncTaskを使用していくつかの操作を実行できます。
  3. RxJavaはFlowableチェーンを使用していくつかのアプリケーションのバックプレッシャ要件を管理しますが、Observableチェーンはバックプレッシャ要件がありません。前者は、バッファリングが必要な場合、または削除された情報の明示的な確認が必要な場合に適しています。
  4. RxJavaには、エラーとエラー処理の明確なセマンティクスがあります。

asyncTaskは、非同期タスクを処理するだけです。

+1

'AsyncTask'はAndroidのコンストラクトですが、RxJavaは純粋なJavaであり、OPのオリジナルの品質を向上させるわけではありません。 –

2

AsyncTaskはUIをブロックせずにUI画面のコンテキストで簡単なロングラン実行作業を行う開発者のためのAndroidのデフォルトツールです。

AsyncTaskの主な問題は、次のとおりです。

  • 複数のWebサービスが CALLS:

    、私たちの活動/フラグメントにおけるインナーAsyncTaskのサブクラスを作成AsyncTaskでこれを解決するためにネットワーク操作を実行しますバックグラウンドを作成し、その操作の結果を取得して、メインスレッドのUIを更新します。

    このアプローチは、いくつかの問題と制限事項があります。

    をメモリ/コンテキストはが簡単に作成されている漏れた内部クラスであるため、また、外部クラスへの暗黙的な参照を保持し、我々は別の長い操作チェーンにしたい場合はどのようなネットワークコール後?私たちは2つのAsyncTasksをネストしなければなりません。

  • 何かがうまくいかない場合はどうなりエラー処理

    ?残念なことに、このためのすぐれたソリューションはありません。 また、デバイスの回転、バックプレスのハンドルなどのような他の問題で解決し、このすべての問題を見に

RxJava

RxJavaを使用してエラー処理は、このようなものです:

webService.doSomething(someData) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(
       result -> resultText.setText("It worked!"), 
       e -> handleError(e)); 

第二に、複数のWebサービスの呼び出しで。

public Observable<List<Weather>> getWeatherForLargeUsCapitals() { 
    return cityDirectory.getUsCapitals() 
         .flatMap(cityList -> Observable.from(cityList)) 
         .filter(city -> city.getPopulation() > 500,000) 
         .flatMap(city -> weatherService.getCurrentWeather(city)) //each runs in parallel 
         .toSortedList((cw1,cw2) -> cw1.getCityName().compare(cw2.getCityName())); 
} 

これがあなたを助けてくれることを願っています!

+0

「デバイス回転、バックプレスハンドルなど」とはどういう意味ですか? - Asyntaskはrxjavaを実行し続けますか? –

+0

RxLifecycleライブラリを使用する場合、.compose(bindToLifecycle())はライフサイクルコールバックを処理します。 –

+0

'.compose(bindToLifecycle())'は何をしますか?それは回転とバックプレスでキャンセルされますか? –

関連する問題