Retrofit 2:如何在特定请求上设置单独的超时时间?

21

我通过以下方式在我的Retrofit适配器中设置了全局超时:

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

谢谢阅读,请帮忙。

1个回答

6
你可以通过创建Retrofit对象工厂方法的重载方法来实现。它可能看起来像这样。
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);
    }


}

如果您想使用默认超时时间调用API,可以像这样调用:

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

如果您需要使用身份验证来调用API,请使用第二个。

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

另一种解决方法是创建具有不同OkHttpClient配置的不同方法,而不是创建重载方法。希望这个解决方案能够解决您的问题。

1
有更加优雅的解决方案,例如:https://dev59.com/01YN5IYBdhLWcg3wfoNj#47388973 - Andrew Gallasch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接