14

我在我的改造适配器中设置了一个全局超时

OkHttpClient okHttpClient = new OkHttpClient();
okHttpClient.setReadTimeout(20, TimeUnit.SECONDS);
okHttpClient.setConnectTimeout(20, TimeUnit.SECONDS);

retrofit = new Retrofit.Builder()
.client(okHttpClient)
.build();

伟大的!但我想为某些请求设置一个特定的超时时间,例如

public interface MyAPI {

    @GET()
    Call<Void> notImportant (@Url String url);

    @GET
    Call<Void> veryImportant(@Url String url);

所以veryImportant调用我想要 35 秒的超时,但notImportant默认值

这可能吗?

我的研究一落千丈。

但是我遇到了这个,但不确定它是否可以在 Retrofit 中使用

https://github.com/square/okhttp/wiki/Recipes#per-call-configuration

感谢您的阅读。请帮忙。

4

2 回答 2

5

您可以通过创建改造对象工厂方法的重载方法来做到这一点。大概是这个样子。

public class RestClient {

    public static final int DEFAULT_TIMEOUT = 20;

    public static <S> S createService(Class<S> serviceClass) {
        OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
        OkHttpClient client = httpClient.build();
        okHttpClient.setReadTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS);
        okHttpClient.setConnectTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS);

        Retrofit retrofit = new Retrofit.Builder().baseUrl(BASE_URL)
            .client(client)
            .build();
        return retrofit.create(serviceClass);
    }

    public static <S> S createService(Class<S> serviceClass, int timeout) {
        OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
        OkHttpClient client = httpClient.build();
        okHttpClient.setReadTimeout(timeout, TimeUnit.SECONDS);
        okHttpClient.setConnectTimeout(timeout, TimeUnit.SECONDS);

        Retrofit retrofit = new Retrofit.Builder().baseUrl(APIConfig.BASE_URL)
            .client(client)
            .build();
        return retrofit.create(serviceClass);
    }


}

如果你想用默认的 timout 调用 api,你可以这样称呼它。

MyAPI api = RestClient.createService(MyAPI.class);
api.notImportant();

如果您想通过身份验证调用 api,请使用第二个:

int timeout = 35;
MyAPI api2 = RestClient.createService(MYAPI.class, timeout);
api2.veryImportant();

另一种解决方案是使用不同的 OkHttpClient 配置创建不同的方法,而不是创建重载方法。希望此解决方案可以解决您的问题。

于 2016-06-14T03:48:31.063 回答
-4

请检查这个。

如果您正在使用,compile 'com.squareup.retrofit:retrofit:1.9.0'则使用下面给出的相同 squareup 库中的 okhttp

compile 'com.squareup.okhttp:okhttp:2.7.2'

在这里我有我的示例代码。

            final OkHttpClient okHttpClient = new OkHttpClient();
            okHttpClient.setReadTimeout(60, TimeUnit.SECONDS);
            okHttpClient.setConnectTimeout(60, TimeUnit.SECONDS);

            RestAdapter restAdapter = new RestAdapter.Builder()
                    .setEndpoint(API)
                    .setLogLevel(RestAdapter.LogLevel.FULL)
                    .setClient(new OkClient(okHttpClient))
                    .build();

注意:60 - 改造将等到 60 秒显示超时。

于 2017-04-25T06:40:11.360 回答