2015-01-14 19 views
6

1st, tôi đã cố gắngLàm thế nào để giữ thuê bao sau onerror (RxJava)

// used retrofit 
public interface ApiService { 
    @GET(/get_some_data) 
    Observable<SomeData> getSomeData(); 
} 



// clickStream created by onClick event 
// No.1 
clickStream 
    .flatMap(e -> apiService.getSomeData()) 
    .subscribe(
     success -> Log.d("tag", "success"), 
     error -> Log.d("tag", "error"), 
     () -> Log.d("tag", "complete")) 

này là tốt nếu getSomeData() là thành công. Tôi có thể nhận được một số dữ liệu mỗi lần nhấp.

nhưng nếu xảy ra lỗi, hủy đăng ký. (do đó bấm không hoạt động sau khi lỗi)


thứ 2, tôi đã cố gắng bên dưới. (Với onErrorResumeNext) nhưng đã hủy đăng ký.

(không gọi onerror, nhưng gọi onComplete. Nên đã hủy đăng ký)

// No.2 
clickStream 
    .flatMap(e -> apiService.getSomeData()) 
    .onErrorResumeNext(throwable -> Observable.empty()) // add this line 
    .subscribe(
     success -> Log.d("tag", "success"), 
     error -> Log.d("tag", "error"), 
     () -> Log.d("tag", "complete")) 

thứ 3, tôi đã cố gắng bên dưới. (Với retry)

// No.3 
clickStream 
    .flatMap(e -> apiService.getSomeData()) 
    .retry(5)           // add this line 
    .subscribe(
     success -> Log.d("tag", "success"), 
     error -> Log.d("tag", "error"), 
     () -> Log.d("tag", "complete")) 

này là tốt hơn so với Không .1. nhưng không được đăng ký.


Tôi muốn thực hiện nút làm mới hoạt động sau khi lỗi.

Tôi muốn biết

  1. Tôi có thể giữ hoặc tái đăng ký thuê bao?
  2. Đây có phải là một cách thích hợp trong Rxjava?

xin lỗi vì tiếng Anh kém của tôi.

Trả lời

8

Nr của bạn. 2 là khá chặt chẽ - thử điều này:

clickStream 
.flatMap(e -> apiService.getSomeData() 
    .onErrorResumeNext(throwable -> Observable.empty())) // add this line 
.subscribe(
    success -> Log.d("tag", "success"), 
    error -> Log.d("tag", "error"), 
    () -> Log.d("tag", "complete")) 

Chú ý rằng tôi chỉ di chuyển một đóng ngoặc để các onErrorResumeNext bây giờ được gọi sau khi mỗi lỗi và là một phần của "bên trong" quan sát được.

+0

Nó làm việc! Tôi có thể giữ thuê bao sau khi onError. Chìa khóa là "** inner ** Observable". cảm ơn bạn! – kyanro

+0

không phải là ẩn/ngăn chặn mọi lỗi? –

+0

Có, tất nhiên - hoặc bạn nhận được 'onError' hoặc bạn có thể tiếp tục sử dụng' Người đăng ký', chứ không phải cả hai. Những gì bạn có thể làm, tuy nhiên, đang phát ra một số loại thông báo lỗi: 'throwable -> Observable.just (new ThereWasSomeProblemWithTheApi()))'. Lệnh 'T' trong' Quan sát 'sau đó sẽ phải có một số giao diện phổ biến mà được chia sẻ bởi 'ThereWasSomeProblemWithTheApi' và kiểu dữ liệu thực tế của bạn. –

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