首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何定制Retrofit2.Call<T>实现

如何定制Retrofit2.Call<T>实现
EN

Stack Overflow用户
提问于 2016-07-19 09:15:33
回答 2查看 2.6K关注 0票数 13

我使用的是Retrofit2,我想重写它的Call.enqueue方法。

到目前为止我这样做了:

自定义调用:

代码语言:javascript
复制
    public class CustomCall<T> implements Call<T> {

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

Apis:

代码语言:javascript
复制
        @GET
        CustomCall<TKBaseResponse> testConnection(@Url String customUrl);

但我不断地发现这些错误:

代码语言:javascript
复制
    Unable to create call adapter for CustomCall<....>

代码语言:javascript
复制
    Could not locate call adapter for CustomCall<....>

我怎样才能做好这件事?提前感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-16 13:02:28

首先创建一个ServiceManager类-

代码语言:javascript
复制
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是一个包含服务端点的类。

代码语言:javascript
复制
final class ServiceApiEndpoints {

    public static final String SERVICE_ENDPOINT = "your_app_url";
}

创建一个接口APIService

代码语言:javascript
复制
public interface APIService {
 String GET_INFO = "get_info";

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

创建ResInfo模型。

代码语言:javascript
复制
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(){

    }
}

打电话给请求。

代码语言:javascript
复制
    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) {

    }
});
票数 8
EN

Stack Overflow用户

发布于 2016-07-19 09:31:06

我在下面张贴一个例子,以帮助您进行改造的实现。

创建这样的资源(MyResource.java)。

代码语言:javascript
复制
Call<TKBaseResponse> testConnection(@@Url String customUrl);

初始化改造

代码语言:javascript
复制
private Resource getRetrofitResource(){
   //Initialize retrofit.
   final Retrofit = .....//your code to initialize retrofit
   return retrofit.create(MyResource.class);
}

要实现call enqueue (异步更新调用),需要将资源响应和响应处理程序(这是您的自定义实现)传递到enqueue方法中。我正在张贴我的ResponseHandler实现与之并排。

代码语言:javascript
复制
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();
    }

}

创建方法句柄响应。

代码语言:javascript
复制
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);
            }
            }
        });
    }

如果你对此有任何疑问,请告诉我。

现在打电话给你的资源如下所示。

代码语言:javascript
复制
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..
 }
    });
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38454253

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档