Android 改装2:如何设置特定请求的单独超时?

Android 改装2:如何设置特定请求的单独超时?,android,retrofit,okhttp,retrofit2,okhttp3,Android,Retrofit,Okhttp,Retrofit2,Okhttp3,我已通过执行以下操作在改装适配器中设置了全局超时 OkHttpClient okHttpClient = new OkHttpClient(); okHttpClient.setReadTimeout(20, TimeUnit.SECONDS); okHttpClient.setConnectTimeout(20, TimeUnit.SECONDS); retrofit = new Retrofit.Builder() .client(okHttpClient) .build(); 太好了!

我已通过执行以下操作在改装适配器中设置了全局超时

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

retrofit = new Retrofit.Builder()
.client(okHttpClient)
.build();
太好了!但是我想为某些请求设置一个特定的超时 例如

公共接口MyAPI{
@得到()
调用notImportant(@Url字符串Url);
@得到
调用veryiimportant(@Url字符串Url);
因此,
veryImportant
调用我希望超时35秒,但
notImportant
默认值

这可能吗

我的研究失败了

然而,我遇到了这个问题,但不确定它是否能在改造中起作用


感谢您的阅读。请提供帮助。

您可以通过创建改造对象工厂方法的重载方法来实现这一点。它可能是这样的

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);
    }


}
MyAPI api = RestClient.createService(MyAPI.class);
api.notImportant();
如果要通过身份验证调用api,请使用第二个:

int timeout = 35;
MyAPI api2 = RestClient.createService(MYAPI.class, timeout);
api2.veryImportant();
另一个解决方案是使用不同的OkHttpClient配置创建不同的方法,而不是创建重载方法。希望此解决方案能够解决您的问题。

请检查此项

如果您使用的是
编译'com.squareup.reformation:reformation: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秒显示超时

            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();