2016-07-19 5 views
10

की कस्टम कार्यान्वयन सुनिश्चित करने के लिए मैं Retrofit2 उपयोग कर रहा हूँ और मैं अपने Call.enqueue विधि ओवरराइड करना चाहते हैं।कैसे Retrofit2.Call <T>

मैं इस अब तक क्या किया:

कस्टम कॉल:

public class CustomCall<T> implements Call<T> { 

     private final Call<T> delegate; 
     //..every method has delegate method invoked in it 

एपिस:

 @GET 
     CustomCall<TKBaseResponse> testConnection(@Url String customUrl); 

लेकिन मैं इन त्रुटियों को मिल रही है:

Unable to create call adapter for CustomCall<....> 

और

Could not locate call adapter for CustomCall<....> 

कैसे मैं इस को ठीक तरह से कर सकते हैं पर कोई तरीका है? अग्रिम में धन्यवाद!

+0

आप बाकी कॉल कोड दिखाकर शुरू कर सकते हैं, और पूर्ण त्रुटि लॉग –

+0

आपको कस्टमकॉल बनाने की आवश्यकता क्यों है?बस किसी भी इंटरफ़ेस क्लास को बनाएं जिसमें के साथ सरल कॉल शामिल हो, किसी भी webservice से कनेक्ट होने वाले किसी भी एप्लिकेशन को बनाने के लिए पर्याप्त होना चाहिए, है ना? – faruk

+0

कृपया यहां से एक नज़र डालें https://github.com/saveendhiman/SampleApp/tree/master/app/src/main/java/com/sampleapp/api – Saveen

उत्तर

1

मैं एक उदाहरण नीचे पोस्टिंग कर रहा हूँ पुराना वापस कार्यान्वयन के साथ मदद करने के लिए।

इस (MyResource.java) की तरह अपने संसाधन बनाएँ।

Call<TKBaseResponse> testConnection(@@Url String customUrl); 

प्रारंभ रेट्रोफिट

private Resource getRetrofitResource(){ 
    //Initialize retrofit. 
    final Retrofit = .....//your code to initialize retrofit 
    return retrofit.create(MyResource.class); 
} 

कॉल को कतारबद्ध (async पुराना वापस कॉल) आप अपने संसाधन प्रतिक्रिया और एक प्रतिक्रिया हैंडलर को कतारबद्ध विधि में अपना कस्टम कार्यान्वयन है जो उत्तीर्ण करने की आवश्यकता को लागू करने। मैं के साथ ResponseHandler की मेरी कार्यान्वयन पोस्टिंग कर रहा हूँ।

public abstract class ResponseHandler<T> { 

    private static final String TAG = ResponseHandler.class.getSimpleName(); 

    private static final String LINE_SEPARATOR = System.getProperty("line.separator"); 

    private final Context context; 

    public ResponseHandler() { 
     this(null); 
    } 

    public ResponseHandler(final Context context) { 
     this.context = context; 
    } 


    public abstract void onResponse(final T response); 

    public void onError(final ErrorResponse errorResponse) { 
     if (context == null) { 
      return; 
     } 
     Log.e(TAG, "An error occurred while invoking service. Error Code: " + errorResponse.getErrorCode() + LINE_SEPARATOR + "Message: " + errorResponse.getMessage() + LINE_SEPARATOR); 
     final AlertDialog.Builder alertBuilder = new AlertDialog.Builder(context); 
     alertBuilder.setCancelable(true); 
     alertBuilder.setTitle(R.string.title_server_error_dialog); 
     alertBuilder.setMessage(R.string.network_error_message); 
     alertBuilder.setPositiveButton(R.string.text_ok, new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(final DialogInterface dialog, final int which) { 
       dialog.dismiss(); 
      } 
     }); 
     alertBuilder.show(); 
    } 

    public void onFailure(Throwable throwable) { 
     if (context == null) { 
      return; 
     } 
     Log.e(TAG, "An error occurred while invoking service", throwable); 
     final AlertDialog.Builder alertBuilder = new AlertDialog.Builder(context); 
     alertBuilder.setCancelable(true); 
     alertBuilder.setTitle(R.string.title_network_error_dialog); 
     alertBuilder.setMessage(R.string.network_error_message); 
     alertBuilder.setPositiveButton(R.string.text_ok, new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(final DialogInterface dialog, final int which) { 
       dialog.dismiss(); 
      } 
     }); 
     alertBuilder.show(); 
    } 

} 

एक विधि हैंडल प्रतिक्रिया बनाएँ।

protected <T> void handleResponse(Call<T> call, final ResponseHandler<T> responseHandler) { 
     call.enqueue(new Callback<T>() { 
      @Override 
      public void onResponse(final Call<T> call, final Response<T> response) { 
       if (response.isSuccess()) { 
       if (responseHandler != null) { 
        responseHandler.onResponse(response.body()); 
       } 
      } else { 
       final ErrorResponse errorResponse = parseError(response); 
       if (responseHandler != null) { 
        responseHandler.onError(errorResponse); 
       } 
      } 
      } 

      @Override 
      public void onFailure(final Call<T> call, final Throwable throwable) { 
       if (responseHandler != null) { 
       responseHandler.onFailure(throwable); 
      } 
      } 
     }); 
    } 

अगर आपको इसके आसपास कोई संदेह है तो कृपया मुझे बताएं।

नीचे की तरह अपने संसाधन फोन से अब

final MyResource resource = getRetrofitResource(); 
final Call<TKBaseResponse> response = resource .testConnection("ANY_URL_OF_YOUR_CHOICE"); 
handleResponse(response, new ResponseHandler<TKBaseResponse>(){ 

public void onResponse(final TKBaseResponse response){ 
     //Do whatever you want to do here.. 
} 
    }); 
+0

लाइब्रेरी ** संसाधन ** से क्या है? –

+0

MyResource एक साधारण जावा इंटरफ़ेस के अलावा कुछ भी नहीं है। आप अधिक indepth के लिए नीचे दिए गए लिंक का पालन कर सकते हैं। http://www.vogella.com/tutorials/Retrofit/article.html मैं कुछ समय निकालने और उचित कोड संरचना के साथ एक बहुत ही बुनियादी उपयोग का प्रदर्शन करने के लिए एक गिट प्रोजेक्ट तैयार करने की कोशिश करूंगा। धन्यवाद –

+0

यह मेरे प्रश्न का उत्तर नहीं देता है कि मैं कॉल

5

पहले एक ServiceManager वर्ग बना सकते हैं -

public final class ServiceManager { 

    private static ServiceManager sServiceManager; 

    /** 
    * Gets the instance of the web services implementation. 
    * 
    * @return the singleton instance. 
    */ 
    public static ServiceManager get() { 
     if (sServiceManager == null) { 
      sServiceManager = new ServiceManager(); 
     } 
     return sServiceManager; 
    } 

    /** 
    * Creates the services for a given HTTP Url, useful when testing 
    * through multiple endpoints and unit testing 
    * 
    * @param clazz the service class. 
    * @param <T> type of the service. 
    * @return the created services implementation. 
    */ 
    public <T> T createService(Class<T> clazz) { 
     return createService(clazz, HttpUrl.parse(ServiceApiEndpoints.SERVICE_ENDPOINT)); 
    } 

    /** 
    * Creates the services for a given HTTP Url, useful when testing 
    * through multiple endpoints and unit testing 
    * 
    * @param clazz the service class. 
    * @param httpUrl the endpoint 
    * @param <T>  type of the service. 
    * @return the created services implementation. 
    */ 
    public <T> T createService(Class<T> clazz, HttpUrl httpUrl) { 
     Retrofit retrofit = getRetrofit(httpUrl); 
     return retrofit.create(clazz); 
    } 

    public <T> T createService(Class<T> clazz, Retrofit retrofit) { 
     return retrofit.create(clazz); 
    } 

    private Retrofit getRetrofit(HttpUrl httpUrl) { 
     return new Retrofit.Builder() 
       .baseUrl(httpUrl) 
       .client(createClient()) 
       .addConverterFactory(getConverter()) 
       .build(); 
    } 

    public Retrofit getPlainRetrofit(HttpUrl httpUrl) { 
     return new Retrofit.Builder() 
       .baseUrl(httpUrl) 
       .client(new OkHttpClient.Builder().build()) 
       .addConverterFactory(getConverter()) 
       .build(); 
    } 

    private Converter.Factory getConverter() { 
     return GsonConverterFactory.create(); 
    } 


    private OkHttpClient createClient() { 
     return new OkHttpClient.Builder().addInterceptor(new RequestInterceptor()).build(); 
    } 

} 

ServiceApiEndpoints एक श्रेणी सेवा समाप्ति-बिंदु होता है।

final class ServiceApiEndpoints { 

    public static final String SERVICE_ENDPOINT = "your_app_url"; 
} 

एक अंतरफलक APIService

public interface APIService { 
String GET_INFO = "get_info"; 

    @GET(GET_INFO) 
    Call<ResInfo[]> getInfo(); 
} 

ResInfo मॉडल बनाएँ।

public class ResInfo { 
    private static final String FIELD_CONTENT = "content"; 

    public String getContent() { 
     return mContent; 
    } 

    public void setContent(final String content) { 
     mContent = content; 
    } 


    @SerializedName(FIELD_CONTENT) 
    private String mContent; 

    public ResInfo(){ 

    } 
} 

अनुरोध पर कॉल करें।

private Call<ResInfo[]> mGetInfoAPICall; 

    APIService apiService=ServiceManager.get().createService(APIService.class); 
    mGetInfoAPICall = apiService.getInfo(); 
    mGetInfoAPICall.enqueue(new Callback<ResInfo[]>() { 
    @Override 
    public void onResponse(Call<ResInfo[]> call, Response<ResInfo[]> response) { 

    } 

    @Override 
    public void onFailure(Call<ResInfo[]> call, Throwable t) { 

    } 
}); 
संबंधित मुद्दे