gpt4 book ai didi

java - 如何自定义实现 Retrofit2.Call

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:07:35 25 4
gpt4 key购买 nike

我正在使用 Retrofit2,我想覆盖它的 Call.enqueue 方法。

到目前为止我这样做了:

自定义调用:

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

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

API:

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

但我不断收到这些错误:

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

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

关于如何正确执行此操作的任何方法?提前致谢!

最佳答案

首先创建一个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";
}

创建接口(interface)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) {

}
});

关于java - 如何自定义实现 Retrofit2.Call<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38454253/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com