2016-04-07 3 views
6

rx.Observable का उपयोग करने से पहले, मैंने रेट्रोफिट के साथ एक कस्टम कॉलबैक का उपयोग किया ताकि मैं प्रतिक्रिया/त्रुटि को संभालने के लिए कुछ विशिष्ट तर्क जोड़ सकूं और बॉयलरप्लेट कोड के रूप में प्रत्येक अनुरोध के लिए कॉलबैक के अंदर ऐसा नहीं करना पड़ेगा।आरएक्सजेवा/रेट्रोफिट - मैं उपयोगकर्ताओं को सब्सक्राइबर के विशिष्ट उप-वर्ग का उपयोग करने के लिए कैसे मजबूर कर सकता हूं?

मैं इस तरह विधि हस्ताक्षर में इसके सामने कस्टम कॉलबैक उपयोग करने के लिए उपयोगकर्ताओं को बाध्य:

@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

प्रश्न यह है कि आपको एक अवलोकन करने की आवश्यकता क्यों है, जब आप मोटे तौर पर किसी भी अवलोकन योग्य का उपयोग नहीं कर पा रहे हैं? क्यों कस्टमकॉलबैक पर्यवेक्षण का विस्तार नहीं करते हैं और फिर इसे इस प्रकार के रूप में वापस करते हैं? जब आप कहते हैं कि आप यह सुनिश्चित करना चाहते हैं कि यह प्रतिक्रिया को प्रॉक्सी करता है, तो आप पर्यवेक्षकों को कहां से प्रॉक्सी करना चाहते हैं? –

+0

लौटा हुआ प्रकार एक आरएक्स होना चाहिए। ऑब्सर्वेबल, उप-वर्ग नहीं है 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(...); 
    } 
} 

तो फिर तुम ही द्वितीय श्रेणी हर जगह अपने कोड में (अधिमानतः का उपयोग आप सामान्य रेट्रोफिट इंटरफेस हो बस डीआई सिस्टम का उपयोग करें) और आप सेट हैं।

यदि आप साहसी महसूस कर रहे हैं, तो आप 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' का उपयोग कर सकते हैं, तो आपको एक स्पष्ट कक्षा की आवश्यकता नहीं है। –

संबंधित मुद्दे

 संबंधित मुद्दे