2016-04-07 7 views
6

Vor der Verwendung von rx.Observable habe ich einen benutzerdefinierten Rückruf mit Nachrüstung verwendet, so dass ich einige spezifische Logik für die Behandlung von Antwort/Fehler hinzufügen kann und dies nicht innerhalb des Rückrufs für jede Anfrage als Standardcode tun muss.RxJava/Retrofit - Wie kann ich Benutzer zwingen, eine bestimmte Unterklasse von Abonnenten zu verwenden?

ich Benutzer zwingen, die benutzerdefinierte Callback zu verwenden, indem es in der Methodensignatur wie folgt setzen:

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

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

aber jetzt, dass ich ein Observable Rückkehr:

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

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

Ich kann nicht finde einen Weg, um sicherzustellen, dass ein benutzerdefinierter Callback immer den Fehler/die Antwort angibt.

Kann ich den Benutzer auch mit Retrofit2.0 zwingen, einen benutzerdefinierten Rückruf mit dem zurückgegebenen Objekt Call zu verwenden?

CustomCallback Referenz:

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

Die Frage ist, warum müssen Sie eine Observable zurückgeben, wenn Sie offensichtlich nicht in der Lage sind, nur eine Observable zu verwenden? Warum nicht CustomCallback Observable erweitern und dann als Typ zurückgeben? Wenn Sie sagen, dass Sie sicherstellen wollen, dass es die Antwort angibt, wo möchten Sie es den Beobachtern vermitteln? –

+0

Der zurückgegebene Typ muss ein rx.Observable sein, keine Unterklasse https://github.com/square/retrofit/blob/parent-1.4.0/retrofit/src/main/java/retrofit/RestAdapter.java#L244 – Prem

Antwort

-1

Stopp. Du denkst das falsch.

Statt dies berücksichtigen: Sie haben die normale Retrofit-Schnittstelle:

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

Und dann haben Sie Ihre Dekorateur Klasse:

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

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

Sie dann nur überall die zweite Klasse verwenden in Ihrem Code (vorzugsweise lass das DI-System das benutzen) und du bist fertig.

Wenn Sie sich abenteuerlustig fühlen, können Sie sogar die RxJavaCallAdapterFactory so anpassen, dass sie die zurückgegebenen Observablen ohne die Notwendigkeit einer benutzerdefinierten Klasse ändert.

+0

Ich weiß, dass das Erstellen einer Decorator-Klasse funktioniert, aber es erfordert, dass Sie jede Methode mit derselben Logik implementieren. Ich war auf der Suche nach einer saubereren Lösung. Und 'RxJavaCallAdapterFactory' https://github.com/square/retrofit/blob/master/retrofit-adapters/rxjava/src/main/java/retrofit2/adapter/rxjava/RxJavaCallAdapterFactory.java ist eine letzte Klasse, die ich hätte meine eigene Gabel von Retrofit zu verwenden, die nicht die Lösung ist, die ich suchte – Prem

+0

Wenn Sie möchten, können Sie eine 'java.lang.reflext.Proxy' verwenden, um das Wrapping zu tun, dann benötigen Sie keine explizite Klasse. –

Verwandte Themen