RxSearchView Switch线程异常。在线等待

时间:2016-06-13 07:41:35

标签: android rx-java

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。 我一直在 切换映射后切换到IO线程。 我使用rxjava版本: &#39; io.reactivex:rxjava:1.1.5&#39 ;. 我该怎么办?

1 个答案:

答案 0 :(得分: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是下游运算符,就应该使用它们多次切换线程。

希望它有所帮助。