監視可能なチェーンでスケジューラーを2回適用する(composeを使用)

ピーターF

アプリに複数のネットワーク呼び出しがあります。このトランスフォーマーでcompose演算子を使用して、IOスレッドでネットワーク要求を実行するのが好きです。

public static <T> Transformer<T, T> runOnIoThread()
{
    return tObservable -> tObservable.subscribeOn( Schedulers.io() )
        .observeOn( AndroidSchedulers.mainThread() );
}

これは、ネットワーク呼び出しが1つしかない限り、うまく機能しているようです。ただし、次の例のようにチェーンすると、AndroidのNetworkInMainThreadExceptionが発生します。

public Observable<String> networkCall1()
{
    return <NETWORK_CALL_1()>
            .compose( runOnIoThread() );
}

public Observable<String> networkCall2( String input )
{
    return <NETWORK_CALL_2(input)>
            .compose( runOnIoThread() );
}

public Observable<String> chainedCalls()
{
    return networkCall1()
            .flatMap( result1 -> networkCall2( result1 ) );
}

以前の私の考えcomposeは、呼び出しの前に完全な監視可能なチェーンに適用され、後のcompose呼び出しは前の呼び出しの動作を「上書き」するというものでした。しかし実際にobserveOnは、最初のcomposeobserveOnメインスレッド)のcompose呼び出しが2番目の呼び出し(subscribeOnIOスレッド)を支配しているように見えます。明らかな解決策の1つは、2つのバージョンを用意することですnetworkCall1。1つはスケジューラーを適用し、もう1つは適用しません。ただし、これにより、コードが非常に冗長になります。

より良い解決策を知っていますか?監視可能なチェーンでスケジューラーを2回(composeを使用して)適用する動作を説明できますか?

編集:ネットワーク呼び出しにRxJavaでレトロフィットを使用しています。

ヤノルド

subscribeOn()ストリームごとに1回のみ使用できます。2回目に使用しても、何も起こりません。そのため、2つのメソッドをチェーン化する場合は、次のように実行します。

observeOn(AndroidSchedulers.mainThread())

これにより、操作がメインスレッドに切り替わります。その後、次subscribeOn()は事実上無視されているため、そこにとどまります

私はあなたが実際にあなたのcomposeメソッドで物事を過度に複雑にしていることを提案します。追加するだけです

subscribeOn(Schedulers.io())

両方のネットワーク通話に使用してから

observeOn(AndroidSchedulers.mainThread())

メインスレッドで結果を処理する直前。あなたは次のようなものになってしまうでしょう:

public Observable<String> networkCall1()
{
    return <NETWORK_CALL_1()>
            .subscribeOn(Schedulers.io);
}

public Observable<String> networkCall2( String input )
{
    return <NETWORK_CALL_2(input)>
            .subscribeOn(Schedulers.io);
}

public Observable<String> chainedCalls()
{
    return networkCall1()
            .flatMap( result1 -> networkCall2( result1 ) )
            .observeOn(AndroidSchedulers.mainThread());
}

編集

本当にobserveOn()個々のネットワーク呼び出し方法で呼び出しを行いたい場合は、それが可能です。メソッドに追加する必要observeOn()がありますchainedCalls()observeOn()ストリームごとに好きなだけ電話をかけることができます。次のようになります。

public Observable<String> networkCall1()
{
    return <NETWORK_CALL_1()>
            .subscribeOn(Schedulers.io)
            .observeOn(AndroidSchedulers.mainThread());
}

public Observable<String> networkCall2( String input )
{
    return <NETWORK_CALL_2(input)>
            .subscribeOn(Schedulers.io)
            .observeOn(AndroidSchedulers.mainThread());
}

public Observable<String> chainedCalls()
{
    return networkCall1()
            .observeOn(Schedulers.io)
            .flatMap( result1 -> networkCall2( result1 ) )
            .observeOn(AndroidSchedulers.mainThread());
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

RxJava:チェーンを切断せずに条件付きでオペレーターを監視可能オブジェクトに適用する方法

分類Dev

Angular2-監視可能なサブスクライブをチェーンする

分類Dev

IBMワークロードスケジューラを使用してSpringバッチをスケジュールおよび監視する

分類Dev

Angularで監視可能なサブスクリプションをチェーンする最良の方法は?

分類Dev

C#でRXを使用して、監視可能なシーケンスで最新のアイテムを取得する

分類Dev

Angular2:サービスとコンポーネント内で監視可能なHttp.postを適切にサブスクライブする方法は?

分類Dev

rxjsの監視可能なチェーンで複合データを渡す

分類Dev

SwiftUIで監視可能なオブジェクトを使用してビューを切り替える

分類Dev

Swift Combine:監視可能なオブジェクトでタイマーパブリッシャーを使用する

分類Dev

ラベルではなくチェックボックス入力にマージンを適用する

分類Dev

jupyter labは、daskスケジューラを監視するためにタブでiframeを開きます

分類Dev

ウォッチビューで基本クラスオブジェクトを監視すると、VS2017で派生クラスのメンバー値が表示されるのはなぜですか?

分類Dev

TakeUntilを使用して監視可能なチェーンを途中で終了するにはどうすればよいですか?

分類Dev

Prometheusを使用してKubernetesクラスターでSpring Bootアプリケーションを監視する

分類Dev

UITableViewCellのUIButtonタップジェスチャをviewModelで監視可能なものにバインドする

分類Dev

親で監視可能な子コンポーネントからEventEmitterを使用する方法(角度2)

分類Dev

ランドスケープモードで変換/回転を適用した後、画像ビューの正確なフレームを取得します

分類Dev

自動トレースのサービスまたはジョブスケジューラのパフォーマンス監視を開始する方法

分類Dev

New Relicエージェントをインストールせずに、サードパーティサービスの一般的な可用性の監視にNewRelicを使用することは可能ですか?

分類Dev

スキーマを使用してバックエンドにセキュリティとデータの非整合性チェックを適用するのに最適なモジュールはどれですか?

分類Dev

Pythonスクリプトを介してスケジュールに基づいてec2インスタンスにパッチを適用することは可能ですか?

分類Dev

RxJavaは、アイテムのリストの監視可能なチェーンを作成します

分類Dev

テキストが空の場合、RxSwiftは監視可能なチェーンを終了します

分類Dev

install4jアンインストーラーアプリケーションにパッチを適用することは可能ですか?

分類Dev

Webpack テンプレートを使用して Vue 2 プロジェクトでスタイラス用プラグインを適用する方法

分類Dev

可能なキーを同時に推測し、オブジェクト値インターフェイスを適用することは可能ですか?

分類Dev

MVVMを使用してリストビューの監視可能なコレクションを更新します

分類Dev

Rufus-ロックを使用しているにもかかわらず2回スケジューリングするスケジューラー

分類Dev

プラットフォーム、AndroidまたはiOSの内部で、メインスレッドを監視するためにどのRxスケジューラを使用する必要がありますか?

Related 関連記事

  1. 1

    RxJava:チェーンを切断せずに条件付きでオペレーターを監視可能オブジェクトに適用する方法

  2. 2

    Angular2-監視可能なサブスクライブをチェーンする

  3. 3

    IBMワークロードスケジューラを使用してSpringバッチをスケジュールおよび監視する

  4. 4

    Angularで監視可能なサブスクリプションをチェーンする最良の方法は?

  5. 5

    C#でRXを使用して、監視可能なシーケンスで最新のアイテムを取得する

  6. 6

    Angular2:サービスとコンポーネント内で監視可能なHttp.postを適切にサブスクライブする方法は?

  7. 7

    rxjsの監視可能なチェーンで複合データを渡す

  8. 8

    SwiftUIで監視可能なオブジェクトを使用してビューを切り替える

  9. 9

    Swift Combine:監視可能なオブジェクトでタイマーパブリッシャーを使用する

  10. 10

    ラベルではなくチェックボックス入力にマージンを適用する

  11. 11

    jupyter labは、daskスケジューラを監視するためにタブでiframeを開きます

  12. 12

    ウォッチビューで基本クラスオブジェクトを監視すると、VS2017で派生クラスのメンバー値が表示されるのはなぜですか?

  13. 13

    TakeUntilを使用して監視可能なチェーンを途中で終了するにはどうすればよいですか?

  14. 14

    Prometheusを使用してKubernetesクラスターでSpring Bootアプリケーションを監視する

  15. 15

    UITableViewCellのUIButtonタップジェスチャをviewModelで監視可能なものにバインドする

  16. 16

    親で監視可能な子コンポーネントからEventEmitterを使用する方法(角度2)

  17. 17

    ランドスケープモードで変換/回転を適用した後、画像ビューの正確なフレームを取得します

  18. 18

    自動トレースのサービスまたはジョブスケジューラのパフォーマンス監視を開始する方法

  19. 19

    New Relicエージェントをインストールせずに、サードパーティサービスの一般的な可用性の監視にNewRelicを使用することは可能ですか?

  20. 20

    スキーマを使用してバックエンドにセキュリティとデータの非整合性チェックを適用するのに最適なモジュールはどれですか?

  21. 21

    Pythonスクリプトを介してスケジュールに基づいてec2インスタンスにパッチを適用することは可能ですか?

  22. 22

    RxJavaは、アイテムのリストの監視可能なチェーンを作成します

  23. 23

    テキストが空の場合、RxSwiftは監視可能なチェーンを終了します

  24. 24

    install4jアンインストーラーアプリケーションにパッチを適用することは可能ですか?

  25. 25

    Webpack テンプレートを使用して Vue 2 プロジェクトでスタイラス用プラグインを適用する方法

  26. 26

    可能なキーを同時に推測し、オブジェクト値インターフェイスを適用することは可能ですか?

  27. 27

    MVVMを使用してリストビューの監視可能なコレクションを更新します

  28. 28

    Rufus-ロックを使用しているにもかかわらず2回スケジューリングするスケジューラー

  29. 29

    プラットフォーム、AndroidまたはiOSの内部で、メインスレッドを監視するためにどのRxスケジューラを使用する必要がありますか?

ホットタグ

アーカイブ