2016-09-18 9 views
8

は、サーバからの検索結果をフェッチし、RecyclerViewで(UIスレッドに)それらを表示します。SearchView、Retrofit、RxJava(RxBindings)で検索機能を実装する方法は? (バックグラウンドスレッド</strong>で<strong>)<code>SearchView</code>ウィジェットにユーザーのタイプは、アプリが API呼び出しを行う必要があります

私は私のフラグメントに次のコードを使用

@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    inflater.inflate(R.menu.my_fragment, menu); 
    SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView(); 

    SearchManager searchManager = (SearchManager) getActivity().getSystemService(Context.SEARCH_SERVICE); 
    searchView.setSearchableInfo(searchManager.getSearchableInfo(getActivity().getComponentName())); 

    RxSearchView.queryTextChanges(searchView) 
       .debounce(400, TimeUnit.MILLISECONDS) 
       .map(CharSequence::toString) 
       .switchMap(query -> retrofitService.search(query)) 
       .subscribeOn(Schedulers.io()) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribe(new Subscriber<List<Item>>() { 
        @Override 
        public void onCompleted() { 

        } 

        @Override 
        public void onError(Throwable e) { 
         Log.e(LOG_TAG, "Error", e); 
        } 

        @Override 
        public void onNext(List<Item> items) { 
         // adapter.addItems(...) 
        } 
       }); 
} 

をしかし、私は例外を取得:私は.subscribeOn(Schedulers.io())を削除するとフラグメントが作成されたときに

java.lang.IllegalStateException: Must be called from the main thread. Was: Thread[RxIoScheduler-2,5,main] 
at com.jakewharton.rxbinding.internal.Preconditions.checkUiThread(Preconditions.java:35) 
at com.jakewharton.rxbinding.support.v7.widget.SearchViewQueryTextChangesOnSubscribe.call(SearchViewQueryTextChangesOnSubscribe.java:18) 
at com.jakewharton.rxbinding.support.v7.widget.SearchViewQueryTextChangesOnSubscribe.call(SearchViewQueryTextChangesOnSubscribe.java:10) 
... 

、検索APIコールが発射されると、 SearchViewにクエリが入力されず、除外されます。

retrofit2.adapter.rxjava.HttpException: HTTP 422 

検索クエリを入力すると、retrofitService.search(query)は呼び出されなくなりました。

答えて

14

実際には、複数のobserveOnと複数のsubscribeOn演算子をrxチェーンで使用できます。

このお試しください:レトロフィットを設定するときにそれ以外の場合は、あなたがイオスレッドを指定することができます

thread usage

+2

- .addCallAdapterFactory(RxJavaCallAdapterFactory.create(スケジューラを:これは基本的にこのスレッドの使用になります

RxSearchView.queryTextChanges(searchView) .debounce(400, TimeUnit.MILLISECONDS) .map(CharSequence::toString) .subscribeOn(AndroidSchedulers.mainThread()) .observeOn(Schedulers.io()) .switchMap(query -> retrofitService.search(query)) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Subscriber<List<Item>>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { Log.e(LOG_TAG, "Error", e); } @Override public void onNext(List<Item> items) { // adapter.addItems(...) } }); 

を.io)) – Outofdate

+0

そして、 '.observeOn(Schedulers.io())'は不要です –

関連する問題

 関連する問題