アプリに複数のネットワーク呼び出しがあります。このトランスフォーマーで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
は、最初のcompose
(observeOn
メインスレッド)のcompose
呼び出しが2番目の呼び出し(subscribeOn
IOスレッド)を支配しているように見えます。明らかな解決策の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]
コメントを追加