2014-07-16 19 views
9

Tôi đang sử dụng Retrofit để trả về rxjava Observable cho các cuộc gọi mạng không đồng bộ của tôi.Trình lập lịch mặc định cho rxjava trên Android

tôi thấy mình lặp lại những lời kêu cầu sau:

someApiCall().subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())

Có vẻ như tôi luôn đăng ký trên thread IO và quan sát trên các chủ đề chính của Android. Điều này có vẻ là thực hành tốt nhất mà tất cả các nguồn tài nguyên tôi tìm được người ủng hộ. Có lẽ khác hơn là tính toán dài hạn, tôi không hoàn toàn hiểu khi nào chúng tôi muốn đi chệch khỏi mô hình này.

Có cách nào để xóa bản mẫu này bằng cách mặc định chủ đề subscribeOn và observOn không?

Đây có phải là trường hợp sử dụng cho rxjava plugins không? (Tôi không thể tìm thấy nhiều ví dụ về việc sử dụng chúng.)

Tôi có thể đặt các chuỗi mặc định tại ranh giới mạng bằng cách làm lộn xộn với retrofit executors không?

+0

Xem câu hỏi/câu trả lời của tôi ở đây để biết cách xử lý một chút: http://stackoverflow.com/a/25576177 – ktusznio

Trả lời

10

Đối với Observable câu trả lời, trang bị thêm hiện tại đặt subscribeOn làm trình xử lý HTTP của RestAdapter (được cung cấp hoặc mặc định). Điều này đã được thực hiện để giảm bớt sự hỗ trợ của RxJava vào hành vi hiện tại.

Gói 2.0 là cung cấp khả năng đặt mặc định cho cả subscribeOnobserveOn một cách rõ ràng (cho dù đó là cả hai, chỉ một hoặc không).

Lý do bạn không muốn luôn luôn muốn quan sát trên chuỗi chính là ví dụ: nếu bạn cần kết hợp nhiều cuộc gọi API với nhau.

+0

trong phiên bản 1.9, tôi thấy rằng không gọi 'subscribeOn (cái gì đó)' (thường là 'Schedulers.io()') trong quá trình kiểm tra thiết bị đo đạc. Đó có phải là hành vi mong đợi không? – njzk2

4

Change Log Phiên bản trang bị thêm 2.0.0-beta2 (2015-09-28) hiển thị đăng kýOn() là bắt buộc để chạy dưới nền.

Khắc phục: Thực thi theo yêu cầu và có thể thực hiện đồng bộ (và do đó yêu cầu đăng ký() để chạy ẩn).

2

, bạn có thể xóa cả hai cuộc gọi.

Đây là lớp chuyển đổi trang bị thêm tự động lịch cả subscribeOnobservedOn để loại bỏ sự cần thiết cho các cuộc gọi soạn sẵn trong mỗi lời gọi:

public class RxThreadingCallAdapterFactory extends CallAdapter.Factory { 
    private final RxJava2CallAdapterFactory original; 

    private RxThreadingCallAdapterFactory() { 
     // Always call on background thread 
     original = RxJava2CallAdapterFactory.createWithScheduler(Schedulers.io()); 
    } 

    public static CallAdapter.Factory create() { 
     return new RxThreadingCallAdapterFactory(); 
    } 

    @Override 
    public CallAdapter<?> get(Type returnType, Annotation[] annotations, Retrofit retrofit) { 
     return new RxCallAdapterWrapper(original.get(returnType, annotations, retrofit)); 
    } 

    private static class RxCallAdapterWrapper implements CallAdapter<Observable<?>> { 
     private final CallAdapter<?> wrapped; 

     public RxCallAdapterWrapper(CallAdapter<?> wrapped) { 
      this.wrapped = wrapped; 
     } 

     @Override 
     public Type responseType() { 
      return wrapped.responseType(); 
     } 

     @Override 
     public <R> Observable<?> adapt(Call<R> call) { 
      Observable observable = (Observable) wrapped.adapt(call); 

      // Always handle result on main thread 
      return observable.observeOn(AndroidSchedulers.mainThread()); 
     } 
    } 
} 

Sau đó sử dụng bộ chuyển đổi này khi cấu hình trang bị thêm:

Retrofit.Builder() 
    .baseUrl(...) 
    .addCallAdapterFactory(RxThreadingCallAdapterFactory.create()) 

Tôi đã viết this blog post mà đi vào rất nhiều chi tiết về chính xác những gì đang xảy ra ở đây.

Điều này sẽ xóa cả hai cuộc gọi mà tôi xem là bản mẫu. Tôi xem xét kịch bản của Jake của chuỗi các cuộc gọi nền với nhau không thực sự áp dụng, bởi vì trong trường hợp này tôi sẽ làm trang bị thêm các cuộc gọi đồng bộ và không sử dụng lịch trình ở tất cả.

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