問題タブ [rx-java2]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
android - RxJava - Hot Observable (インターバル) を停止 (および再開) する方法は?
私は次のホットオブザーバブルを持っています:
しかし、私はそれを止める良い方法を見つけることができません。フラグ ( )を使用takeWhile
して、これを部分的に解決できました。boolean
runTimer
ただし、このアプローチには気に入らない点が 2 つあります。
- フラグを維持する必要があり
runTimer
ますが、これは望ましくありません。 - に
runTimer
なるfalse
と、Observable は単純に完了します。つまり、もう一度出力したい場合は、新しい Observable を作成する必要があります。私はそれをしたくありません。もう一度開始するように指示するまで、Observable にアイテムの発行を停止させたいだけです。
私は次のようなことを望んでいました:
そうすれば、フラグを保持する必要がなく、オブザーバブルは常に生きています (ただし、イベントを発行していない可能性があります)。
どうすればこれを達成できますか?
android - RxJava 2 と Retrofit 2 を使用して、アダプターのバージョンの問題
Android Studio の既存のアプリケーション モジュールに新しいライブラリ モジュールを追加しました。主な違いは、RxJava 2 と Retrofit 2 を追加したことです。新しいモジュールの build.gradle を更新した後、次のエラーが発生し始めました。
エラー: タスク ':app:transformResourcesWithMergeJavaResForBetaNewApiDebug' の実行に失敗しました。com.android.build.api.transform.TransformException: com.android.builder.packaging.DuplicateFileException: APK にコピーされた重複ファイル META-INF/rxjava.properties File1: C:\Users\Gaket.gradle\caches\modules-2 \files-2.1\io.reactivex.rxjava2\rxjava\2.0.2\cfccdd18cdfbe7b4773d42c9f3512eeafbe5cbf9\rxjava-2.0.2.jar File2: C:\Users\Gaket.gradle\caches\modules-2\files-2.1\io.reactivex \rxjava\1.1.5\ece7b5d0870e66d8226dab6dcf47a2b12afff061\rxjava-1.1.5.jar
RxJava に問題があるようです (RxJava 2 を試してみたいのですが、RxJava 1 と RxJava 2 の両方が表示されます)。すべての依存関係を追加した直後に問題が発生しRxJava
ます。メインアプリケーションでは使用しません。
更新: 以下で述べたように、3 つのトピックを確認しました (以下で確認できます)。この問題:重複の可能性は、以下で既に言及したものと似ています: this one。どちらにも、回答で下線を引いた実際の問題を考慮していない回避策があります。そして答えは、「現時点では、Retrofit 2 から RxJava 2 への本番対応のアダプターはありません」です (詳細については、以下の回答を参照してください)。
私はいくつかのトピックをチェックしました.1つ目 は具体的な問題の具体的な解決策であり、2rxbindings
つ目は. 「rxjava 2 and retrofit 2」をグーグルで検索しようとしましたが、解決策が見つかりませんでした。
build.gradle
ライブラリは次のとおりです。
問題は、
なぜこの問題が発生するのか、そしてそれを処理する適切な方法は何かということです。
rx-java2 - RxJava 2: サブジェクトの置き換え
RxJava 1.x ではT -> R
、Subject
. たとえば、入力タイプが でInteger
、出力タイプが である可能性がありますString
。RxJava 2.0 では、このオプションは削除されましSubject<T>
たSubject<T,R>
。この変更は、RxJava wiki のWhat's difference in 2.0ドキュメントにも記載されていますが、残念ながら代替品は提供されていません。Subject
asを宣言する以外に何かありSubject<Object>
ますか?
android - RxJava2 を使用したサブスクライバーの再クエリと更新
アプリにレトロフィット サービスに支えられたデータ レイヤーがあります。(これまでのところ、ネットワーク経由の永続性のみがあります。開発が進んだら、オフライン ファーストのローカル ストレージを追加します)
Observable<List<Item>>
サーバーを呼び出すとRetrofit から が返されます。これはうまくいきます。サブスクライバーでは、サブスクライブ時にリストを受け取り、UI にItems
.
私が抱えている問題は次のとおりです。リストが(何らかの外部メカニズムによって)変更された場合、オブザーバブルがレトロフィットサービスを再クエリし、アイテムの新しいリストを発行するにはどうすればよいですか。データが古いことは承知していますが、再クエリを開始する方法がわかりません。
これが私の簡略化されたバージョンですDataManager
android - JUnit を使用した RxJava2: テストで例外がスローされない
以下のコードは、JUnit 環境で実行してもクラッシュしません。しかし、アプリで実行するとクラッシュします。コンソールにエラー ログが表示されますが、テストは合格としてマークされています。
問題は、JUnit でクラッシュさせる方法です。ええ、アプリで何かが機能しない場合、単体テストでも機能しないのは良いことです:)
この例では、オブザーバブルに直接アクセスできます。しかし、私の実際のテストでは、それはありません。実際のオブザーバブルは、テストされるクラスの内部の詳細にすぎません。私ができることのほとんどは、スケジューラまたは何かを注入することです。
では、オブザーバブルに直接アクセスせずにクラッシュさせる方法は?
また、このコードもクラッシュしないことを確認しました。
android - RxJava2 JUnit テスト
RxJava コード部分の単体テストに問題があります。以下の方法をテストしたいと思います。プレゼンター方式です。
最良の場合backendService
、特定の検索クエリとアタッチ/デタッチ ビューでこのユースケースをモックしてテストしたいと思います。
私はいくつかの調査を行いtoBlocking()
、test()
方法を認識しています。彼らは皆、私が利用可能であると想定していObservable
ます。どうにかしてメソッドを分割する必要があると思います。それに対するあなたのアプローチは何ですか?
私のスタック: RxJava2、短剣、MVP。
android - RxJava2: retryWhen を使用して非同期コールバックの例外を処理できません
MQTT ブローカーに接続しようとしています。接続に失敗した場合に備えて再試行したい。接続の成功または失敗でコールバックを受け取ります。
retryWhen の複数の例を読み、非同期コールバックを処理した後、このコードをまとめました。接続に成功すれば問題なく動作します。e.onError(throwable)
また、から同期的に呼び出すと、3 回リトライしFlowable
ます。e.onError(throwable)
しかし、コールバックのonFailure()
メソッドから呼び出すと、Android アプリがクラッシュします。
コードは次のとおりです。
RxJavaチェーン
Flowable を作成する
リトライ機能を作る
消費者: ここですべての良いことを行う
エラーログ
質問
- このコードがアプリをクラッシュさせる例外をスローするのはなぜですか? 理想的には、例外を処理する必要がありますか? ここで何が欠けていますか?
- 3回再試行しないのはなぜですか?
- メソッド
e.onError(throwable)
から同期的に呼び出すと、同じコードが正しく再試行されるのはなぜですか?Flowable.subscribe()
参考文献