2016-04-07 15 views
6

rx.Observable'u kullanmadan önce, retrofit ile özel bir geri arama kullandım, böylece yanıtı/hatayı işlemek için belirli bir mantığı ekleyebilirim ve boilerplate kodu olarak her istek için bunu geri arama içinde yapmak zorunda değilim.RxJava/Retrofit - Kullanıcıları belirli bir Abone alt sınıfını kullanmaya nasıl zorlayabilirim?

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

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

Yapamam:

böyle bir yöntem imzası koyarak özel geri arama kullanmalarını zorlamak: Bir Observable

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

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

ama şimdi dönen ediyorum Özel bir geriçağırımın her zaman hata/yanıtı proxy yaptığını doğrulamak için bir yol bulmak.

Ayrıca, retrofit2.0 ile, kullanıcıyı döndürülen Call nesnesini kullanarak özel bir geri arama kullanmasını nasıl zorlayabilirim? referans için

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

Sorular, gözlemlenebilir olanı kullanamadığınızı gördüğünüzde, gözlemlenebilir bir geri dönüşü neden geri göndermeniz gerektiğidir. Neden CustomCallback'in Gözlemlenebilir hale getirilmemesini ve sonra da bu türünü geri döndürmemesini sağlayın? Yanıtı proxy yaptığını, nerede vekil olmak istediğinizi, gözlemcilere bildirmek istediğinizi söylediğinizde? –

+0

döndürülen tür bir rx olmalıdır. Alt sınıf değil https://github.com/square/retrofit/blob/parent-1.4.0/retrofit/src/main/java/retrofit/RestAdapter.java#L244 – Prem

cevap

-1

Dur. Bunu yanlış şekilde düşünüyorsun.

yerine bu göz önünde bulundurun: o

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

Ve siz dekoratör sınıf var: Eğer tercihen (kodunuzda her yerde sadece ikinci sınıfını kullanın Ardından

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

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

Normal Retrofitler arayüzüne sahip sadece DI sisteminin kullanmasına izin ver) ve sen ayarladın.

Macera dolu hissediyorsanız, RxJavaCallAdapterFactory modelini, özel bir sınıfa gerek duymadan döndürülen gözlenebilirleri değiştirecek şekilde uyarlayabilirsiniz.

+0

Bir dekoratör sınıfı oluşturmanın işe yarayacağını biliyorum, ancak her yöntemi aynı mantıkla uygulamanızı gerektirir. Daha temiz bir çözüm arıyordum. Ve 'RxJavaCallAdapterFactory' https://github.com/square/retrofit/blob/master/retrofit-adapters/rxjava/src/main/java/retrofit2/adapter/rxjava/RxJavaCallAdapterFactory.java bir son sınıf olur. Ben kendi çözümünü kullanmıyorum. Bu çözüm benim için – Prem

+0

aradım. Eğer isterseniz, sarmak için bir java.lang.reflext.Proxy kullanabiliyorsunuz, o zaman açık bir sınıfa ihtiyacınız yok. –

İlgili konular