2016-04-07 15 views
6

Przed użyciem rx.Observable użyłem niestandardowego wywołania zwrotnego z doposażeniem, więc mogę dodać określoną logikę do obsługi odpowiedzi/błędu i nie muszę tego robić w oddzwanianiu dla każdego żądania, jako kod tablicy.RxJava/Retrofit - Jak zmusić użytkowników do korzystania z określonej podklasy subskrybenta?

I zmusić użytkowników do korzystania z niestandardowych zwrotnego poprzez umieszczenie go w sygnaturze metody tak:

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

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

ale teraz, że jestem zwrócenie Observable:

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

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

nie mogę wymyślić sposób, aby upewnić się, że niestandardowe oddzwanianie zawsze prosi o błąd/odpowiedź.

Również, z retrofit2.0, jak mogę zmusić użytkownika do korzystania z niestandardowego wywołania zwrotnego ze zwróconym obiektem Call?

CustomCallback dla odniesienia:

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

Pytanie brzmi: dlaczego powinieneś zwrócić obserwowalne, a gdy nie jesteś w stanie użyć żadnego obserwowalnego? Dlaczego nie chcesz, aby CustomCallback był rozszerzalny, a następnie zwracany jako typ? Kiedy mówisz, że chcesz mieć pewność, że to odpowiedź, do której z nich chcesz się zwrócić, do obserwatorów? –

+0

Zwrócony typ musi być rx.Observable, a nie podklasą https://github.com/square/retrofit/blob/parent-1.4.0/retrofit/src/main/java/retrofit/RestAdapter.java#L244 – Prem

Odpowiedz

-1

Zatrzymaj. Myślisz o tym w niewłaściwy sposób.

Zamiast rozważyć to: masz normalny interfejs modernizacyjny:

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

A potem masz klasę dekorator:

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

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

Następnie należy używać tylko drugą klasę wszędzie w kodzie (najlepiej pozwól, aby system DI użył tego) i gotowe.

Jeśli czujesz się na siłach, możesz nawet dostosować RxJavaCallAdapterFactory, aby zmodyfikować zwrócone obserwacje bez potrzeby stosowania niestandardowej klasy.

+0

Wiem, że tworzenie klasy dekoratorów będzie działać, ale wymaga wdrożenia każdej metody z tą samą logiką. Szukałem czystszego rozwiązania. I 'RxJavaCallAdapterFactory' https://github.com/square/retrofit/blob/master/retrofit-adapters/rxjava/src/main/java/retrofit2/adapter/rxjava/RxJavaCallAdapterFactory.java jest ostateczną klasą, więc bym miał używać własnego rozwidlenia modernizacji, które nie jest rozwiązaniem, którego szukałem. – Prem

+0

Jeśli chcesz, możesz użyć 'java.lang.reflext.Proxy' do wykonania owijania, wtedy nie potrzebujesz wyraźnej klasy. –