2016-06-13 3 views
1
mSubscription = RxSearchView.queryTextChangeEvents(mSearchView) 
        .subscribeOn(AndroidSchedulers.mainThread()) 
        .debounce(600, TimeUnit.MILLISECONDS, AndroidSchedulers.mainThread()) 
        .filter(new Func1<SearchViewQueryTextEvent, Boolean>() { 
         @Override 
         public Boolean call(SearchViewQueryTextEvent searchViewQueryTextEvent) { 
          String query = searchViewQueryTextEvent.queryText().toString(); 
          if (!TextUtils.isEmpty(query) && query.length() >= 11) { 
           if (!CommonUtil.isMobileNumber(query)) { 
            PromptManager.getInstance().showToast("please input valid phone"); 
            return false; 
           } 
          } 
          boolean b =        !TextUtils.isEmpty(searchViewQueryTextEvent.queryText().toString()); 
          return b; 
         } 
        }) 
        .switchMap(new Func1<SearchViewQueryTextEvent, Observable<BaseResponseWrapper<SearchUserResponse>>>() { 
         @Override 
         public Observable<BaseResponseWrapper<SearchUserResponse>> call(SearchViewQueryTextEvent searchViewQueryTextEvent) { 
          // Why run in the main thread here 
          // 2016/6/12 reset api request 
          String res = searchViewQueryTextEvent.queryText().toString(); 
          return RetrofitManager.newInstance().getApi().searchUserByPhone(res); 
         } 
        })  
        // switch io thread 
        .subscribeOn(Schedulers.io()) 
        .map(new Func1<BaseResponseWrapper<SearchUserResponse>, List<SearchUserResponse>>() { 
         @Override 
         public List<SearchUserResponse> call(BaseResponseWrapper<SearchUserResponse> fuzzyUserRes) { 
           // some code here    
         } 
        }) 
        .observeOn(AndroidSchedulers.mainThread()) 
        .subscribe(new Subscriber<List<SearchUserResponse>>() { 
         @Override 
         public void onCompleted() { 
         } 
         @Override 
         public void onError(Throwable e) { 
          LogUtils.w("end thread:" + Thread.currentThread().getName()); 
          LogUtils.w("e :" + e); 
          **//there throw exception android.os.NetworkOnMainThreadException** 
         } 
         @Override 
         public void onNext(List<SearchUserResponse> fuzzyUsers) { 
          updateUI(fuzzyUsers); 
         } 
        }); 

searchviewに入力すると、onErrorメソッドはandroid.os.NetworkOnMainThreadExceptionをスローします。 私は に入っていますswitchmapスイッチをIOスレッドに切り替えた後。 私はrxjavaバージョン: 'io.reactivex:rxjava:1.1.5'を使用しています。 私は何ができますか?RxSearchViewスイッチ例外。オンライン待機中

答えて

1

subscribeOnを同じストリームで2回呼び出すことはできません。最初のものだけがカウントされます。

あなたのコードは次のようになります。

mSubscription = RxSearchView.queryTextChangeEvents(mSearchView) 
       .debounce(600, TimeUnit.MILLISECONDS, AndroidSchedulers.mainThread()) 
       .filter(new Func1<SearchViewQueryTextEvent, Boolean>() { 
        @Override 
        public Boolean call(SearchViewQueryTextEvent searchViewQueryTextEvent) { 
         String query = searchViewQueryTextEvent.queryText().toString(); 
         if (!TextUtils.isEmpty(query) && query.length() >= 11) { 
          if (!CommonUtil.isMobileNumber(query)) { 
           PromptManager.getInstance().showToast("please input valid phone"); 
           return false; 
          } 
         } 
         boolean b =        !TextUtils.isEmpty(searchViewQueryTextEvent.queryText().toString()); 
         return b; 
        } 
       }) 
       // switch io thread 
       .observeOn(Schedulers.io()) 
       .switchMap(new Func1<SearchViewQueryTextEvent, Observable<BaseResponseWrapper<SearchUserResponse>>>() { 
        @Override 
        public Observable<BaseResponseWrapper<SearchUserResponse>> call(SearchViewQueryTextEvent searchViewQueryTextEvent) { 
         // Why run in the main thread here 
         // 2016/6/12 reset api request 
         String res = searchViewQueryTextEvent.queryText().toString(); 
         return RetrofitManager.newInstance().getApi().searchUserByPhone(res); 
        } 
       }) 
       .map(new Func1<BaseResponseWrapper<SearchUserResponse>, List<SearchUserResponse>>() { 
        @Override 
        public List<SearchUserResponse> call(BaseResponseWrapper<SearchUserResponse> fuzzyUserRes) { 
         // some code here 
        } 
       }) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribe(new Subscriber<List<SearchUserResponse>>() { 
        @Override 
        public void onCompleted() { 
        } 
        @Override 
        public void onError(Throwable e) { 
         LogUtils.w("end thread:" + Thread.currentThread().getName()); 
         LogUtils.w("e :" + e); 
         **//there throw exception android.os.NetworkOnMainThreadException** 
        } 
        @Override 
        public void onNext(List<SearchUserResponse> fuzzyUsers) { 
         updateUI(fuzzyUsers); 
        } 
       }); 

は限りobserveOnが下流事業者であるとして、あなたは、スレッド上で何度も切り替えるためにそれらを使用する必要があります。

希望するとうれしいです。