RxJava/Retrofit - 如何强制用户使用Subscriber的特定子类?

Pre*_*rem 6 android rx-java retrofit retrofit2

在使用之前rx.Observable,我使用了一个带有改进的自定义回调,所以我可以添加一些特定的逻辑来处理响应/错误,而不必在回调中为每个请求作为样板代码.

我强制用户通过将它放在方法签名中来使用自定义回调,如下所示:

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

@GET("/profile_endpoint/")
void getProfile(CustomCallback<Profile> callback);
Run Code Online (Sandbox Code Playgroud)

但是现在我回来了Observable:

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

@GET("/profile_endpoint/")
Observable<Profile> getProfile();
Run Code Online (Sandbox Code Playgroud)

我无法找到一种方法来确保自定义回调始终代理错误/响应.

另外,使用retrofit2.0,如何强制用户对返回的Call对象使用自定义回调?

CustomCallback供参考:

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);
}
Run Code Online (Sandbox Code Playgroud)

Tas*_*kos -1

停止。你的想法是错误的。

相反,请考虑这一点:您有正常的 Retrofit 界面:

interface Foo {
   @GET("/user_endpoint/")
   Observable<User> getUser();
}
Run Code Online (Sandbox Code Playgroud)

然后你就有了装饰器类:

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

    @Override
    public Observable<User> getUser() {
       return delegate.getUser().doOnNext(...).doOnError(...);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您在代码中的任何地方都只使用第二个类(最好让 DI 系统使用它),然后您就完成了。

如果您喜欢冒险,您甚至可以对其进行调整,RxJavaCallAdapterFactory以便它可以修改返回的可观察值,而无需自定义类。