2015-07-15 31 views
6

Tôi muốn thực hiện tìm kiếm chuẩn trong ứng dụng Android, nơi tôi nhập EditText, đợi một chút cho đến khi người dùng nhập xong và kích hoạt mạng yêu cầu sử dụng Retrofit:.debounce của RxJava() can thiệp vào chủ đề Quan sát của tôi và xử lý lỗi

// 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()); 
      } 
     ); 

Bây giờ, tôi có một máy chủ kiểm tra thực hiện cuộc gọi trang bị thêm và trả về danh sách. Khi tôi nhập 'sự cố', máy chủ thực hiện một số mã và lỗi không hợp lệ, trả lại mã trạng thái http 500 và một số lỗi html. Vì vậy, cuộc gọi trang bị thêm không thành công.

Tôi nghĩ chuỗi bên ngoài có thể quan sát không được thực hiện bằng cách này. Xem câu hỏi trước của tôi: In RxJava, how to retry/resume on error, instead of completing the observable

Tuy nhiên, bên ngoài Quan sát cũng có lỗi, khiến cho chuỗi bị chấm dứt. Lỗi này là: The current thread must have a looper!

Lạ. Bây giờ tôi thử mà không có .debounce() và điều tương tự xảy ra, máy chủ có lỗi nội bộ, nhưng bên ngoài có thể quan sát được không phải lỗi.

Vì vậy, nó có ý nghĩa gì đối với các chủ đề đang gây ra hành vi này? Và làm thế nào tôi có thể làm việc xung quanh nó?

Trả lời

0

Có vẻ như vấn đề này có thể được với debounce tạo một chủ đề mới cho mã để thực hiện, từ docs:

Phiên bản này hoạt động bằng cách mặc định trên Scheduler tính toán, nhưng bạn có thể tùy chọn vượt qua trong một Scheduler của lựa chọn của bạn như một tham số thứ ba.

Bạn có thể cần chuyển qua trình lên lịch Android với Looper nền sẽ giải quyết lỗi (theo lý thuyết, rất tiếc, không thể chạy nội dung của bạn ngay bây giờ mà không có máy chủ).

+0

Tôi nghĩ rằng tôi đã thử tất cả các biến thể .. không thành công, thật không may. Tôi nghĩ rằng tôi có thể hỏi về trình theo dõi vấn đề RxJava/RxAndroid – xorgate

+0

@xorgate bạn có nhận được phản hồi nào không? Tôi đang gặp vấn đề tương tự. Trân trọng – cesarferreira

+0

@cesarferreira thực sự tôi đã không hỏi. Tuy nhiên tôi đã loại bỏ các .debounce() nhưng tôi không quá hạnh phúc về nó ... – xorgate

5

Thêm vào pturner's answer, các Scheduler có thể được thông qua như

.debounce(400, TimeUnit.MILLISECONDS, AndroidSchedulers.mainThread())

Điều này sẽ khiến người quan sát để làm việc trên các chủ đề chính (UI thread) của Android, và sẽ ngăn chặn Observer từ ném lỗi.

Các vấn đề liên quan