2016-04-07 23 views
6

Trước khi sử dụng rx.Observable, tôi đã sử dụng gọi lại tùy chỉnh với trang bị thêm để tôi có thể thêm một số logic cụ thể để xử lý phản hồi/lỗi và không phải thực hiện điều đó bên trong gọi lại cho mọi yêu cầu dưới dạng mã bản mẫu.RxJava/Retrofit - Làm cách nào để buộc người dùng sử dụng một lớp con cụ thể của Người đăng ký?

Tôi buộc người dùng phải sử dụng gọi lại tùy chỉnh bằng cách đặt nó trong chữ ký phương pháp như thế này:

@GET("/user_endpoint/") 
void getUser(CustomCallback<User> callback); 

@GET("/profile_endpoint/") 
void getProfile(CustomCallback<Profile> callback); 

nhưng bây giờ mà tôi đang trả lại một Observable:

@GET("/user_endpoint/") 
Observable<User> getUser(); 

@GET("/profile_endpoint/") 
Observable<Profile> getProfile(); 

tôi không thể tìm ra một cách để đảm bảo rằng một cuộc gọi lại tùy chỉnh luôn luôn proxy các lỗi/phản ứng.

Ngoài ra, với retrofit2.0, làm cách nào để buộc người dùng sử dụng gọi lại tùy chỉnh với đối tượng Call trả về?

CustomCallback để tham khảo:

public abstract class CustomCallback<T> implements Callback<T> { 

    @Override public final void success(T t, Response response) { 
    // do some logic 
    onSuccess(t); 
    } 

    @Override public final void failure(RetrofitError error) { 
    // do something with the error here such as show a Toast 
    Toast.makeText(Application.getInstance(), error.getLocalizedMessage(), Toast.LENGTH_SHORT).show(); 
    onFailure(error); 
    } 

    public abstract void onSuccess(T response); 

    public abstract void onFailure(Throwable error); 
} 
+0

Các câu hỏi là tại sao bạn cần phải trả lại một quan sát được, khi bạn không thể sử dụng bất kỳ quan sát nào một cách lúng túng? Tại sao không làm cho CustomCallback mở rộng quan sát và sau đó trả lại này như là loại? Khi bạn nói rằng bạn muốn chắc chắn rằng nó ủy quyền phản hồi, bạn muốn proxy nó ở đâu, cho các nhà quan sát? –

+0

loại trả về phải là một rx.Observable, không phải là một lớp con https://github.com/square/retrofit/blob/parent-1.4.0/retrofit/src/main/java/retrofit/RestAdapter.java#L244 – Prem

Trả lời

-1

Stop. Bạn đang suy nghĩ điều này một cách sai lầm.

Thay vào đó xem xét việc này: Bạn có giao diện Retrofit bình thường:

interface Foo { 
    @GET("/user_endpoint/") 
    Observable<User> getUser(); 
} 

Và sau đó bạn có lớp trang trí của bạn:

public class FooDecorator implements Foo { 
    private Foo delegate = ...; // inject or create the Retrofit instance. 

    @Override 
    public Observable<User> getUser() { 
     return delegate.getUser().doOnNext(...).doOnError(...); 
    } 
} 

Sau đó, bạn chỉ sử dụng các lớp học thứ hai ở khắp mọi nơi trong mã của bạn (tốt nhất chỉ cần để hệ thống DI sử dụng điều đó) và bạn đã thiết lập.

Nếu bạn cảm thấy mạo hiểm, bạn thậm chí có thể điều chỉnh RxJavaCallAdapterFactory để nó sửa đổi các quan sát được trả về mà không cần lớp tùy chỉnh.

+0

Tôi biết rằng việc tạo một lớp trang trí sẽ hoạt động nhưng nó đòi hỏi bạn phải thực hiện mọi phương thức với cùng một logic. Tôi đang tìm một giải pháp sạch hơn. Và 'RxJavaCallAdapterFactory' https://github.com/square/retrofit/blob/master/retrofit-adapters/rxjava/src/main/java/retrofit2/adapter/rxjava/RxJavaCallAdapterFactory.java là một lớp học cuối cùng nên tôi có sử dụng nĩa của riêng tôi của retrofit mà không phải là giải pháp tôi đang tìm kiếm – Prem

+0

Nếu bạn muốn, bạn có thể sử dụng một 'java.lang.reflext.Proxy' để làm các gói, sau đó bạn không cần một lớp rõ ràng. –

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