Android アプリで標準的な検索を行いたいと思います。ここで を入力しEditText
、ユーザーが入力し終わるまで少し待ってから、 Retrofit を使用してネットワーク リクエストを起動します。
// make observable out of EditText
Observable<OnTextChangeEvent> textObs = WidgetObservable.text(searchText);
mSearchResultSubscription =
textObs
// wait until user has not typed for 350 milliseconds
.debounce(350, TimeUnit.MILLISECONDS)
// get the string the user typed
.map(OnTextChangeEvent::text)
.map(CharSequence::toString)
// start a new observable (from Retrofit)
.flatMap(
q ->
// try network call and return my data
MyRetrofitAPI.getService().search(q)
// if this fails, just return empty observable
.onErrorResumeNext(error -> {
Log.e("Error from retrofit: " + error.getLocalizedMessage());
return Observable.empty();
})
)
// if all is well, show the contents on the screen somehow
.observeOn(AndroidSchedulers.mainThread())
.subscribe(a -> {
mAdapter.setItems(a);
}
, error -> {
Log.e("Also error in outer observable: " + error.getLocalizedMessage());
}
);
これで、改造呼び出しを受け取り、リストを返すテストサーバーができました。「crash」と入力すると、サーバーは無効なコードとエラーを実行し、http ステータス コード 500 とエラー html を返します。そのため、レトロフィット コールは失敗します。
これにより、外側の Observable チェーンが影響を受けるべきではないと思います。私の前の質問を参照してください: RxJava では、オブザーバブルを完了する代わりに、エラー時に再試行/再開する方法
ただし、外側の Observable もエラーになり、チェーンが終了します。エラーは次のとおりです。
The current thread must have a looper!
変。今、私はなしで試してみました.debounce()
が、同じことが起こりました。サーバーには内部エラーがありますが、外側の Observable はエラーになりません。
.debounce()
では、この動作を引き起こしているスレッドに対して何をするのでしょうか? どうすれば回避できますか?