2016-06-13 49 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兩次。只有第一個會算。

您的代碼應該是這樣的:

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是下游運營商,你應該使用它們來在線程多次切換。

希望它有幫助。