2016-04-07 5 views
6

rx.Observableを使用する前に、私はretrofit付きのカスタムコールバックを使用しました。応答/エラーを処理するための特定のロジックを追加し、コールバック内でコールバックコードのようにすべての要求に対してコールバックを行う必要はありません。RxJava/Retrofit - ユーザーにSubscriberの特定のサブクラスを使用させるにはどうすればよいですか?

私はこのようなメソッドのシグネチャにそれを置くことによって、カスタムコールバックを使用するようにユーザに強制:

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

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

が、今、私はObservableを返してること:

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

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

私はできませんカスタムコールバックが常にエラー/レスポンスをプロキシすることを確認する方法を見つけます。

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); 
} 
+0

質問はなぜあなたは観察可能なものを返す必要がありますか? CustomCallbackをObservableに拡張して、これを型として返すのはなぜですか?あなたはそれがプロキシを確実にプロキシしたいと思っているとき、それをどこにプロキシしたいのですか? –

+0

返される型は、サブクラスではなくrx.Observableでなければなりません。https://github.com/square/retrofit/blob/parent-1.4.0/retrofit/src/main/java/retrofit/RestAdapter.java#L244 – Prem

答えて

-1

ストップ。あなたはこれを間違った方法で考えています。

代わりに、このことを考慮してください。その後、

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

そして、あなたはあなたのデコレータのクラスがあります:あなたは、好ましくは、(あなたのコードのどこでも唯一の第二のクラスを使用すると

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

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

をあなたは、通常のレトロフィット・インターフェースを持っていますDIシステムにそれを使用させてください)、あなたが設定されています。

あなたが冒険していると感じたら、RxJavaCallAdapterFactoryを調整して、カスタムクラスを必要とせずに返された観測値を変更することもできます。

+0

私はデコレータクラスを作成することはできますが、すべてのメソッドを同じロジックで実装する必要があることは知っています。私はよりクリーンなソリューションを探していました。そして 'RxJavaCallAdapterFactory' https://github.com/square/retrofit/blob/master/retrofit-adapters/rxjava/src/main/java/retrofit2/adapter/rxjava/RxJavaCallAdapterFactory.javaは最終的なクラスですので、私が探していた解決策ではない自分自身のフォークを使用する – Prem

+0

あなたが望むならば、あなたは 'java.lang.reflext.Proxy'を使ってラッピングを行い、明示的なクラスは必要ありません。 –

関連する問題