Как увеличить тайм-аут для ретрофицированных запросов в robospice android?

Я реализовал robospice в своем проекте и использовал модификацию для всех вызовов api. Для некоторых запросов мне нужно увеличить тайм-аут, пожалуйста, дайте мне знать, как я могу это сделать?

На самом деле я использую службу, которая расширяет RetrofitGsonSpiceService. Код моего класса обслуживания ниже:

Открытый класс MyService расширяет RetrofitGsonSpiceService {

@Override
public void onCreate() {
    super.onCreate();
    addRetrofitInterface(MyInterface.class);
}

@Override
public CacheManager createCacheManager(Application application) throws CacheCreationException {
    CacheManager cacheManager = new CacheManager();
    ObjectPersisterFactory persistFactory = new RetrofitObjectPersisterFactory(application,
            getConverter(), getCacheFolder());

    persistFactory.setAsyncSaveEnabled(true);
    cacheManager.addPersister(persistFactory);

    return cacheManager;
}

@Override
protected String getServerUrl() {
    return Utils.getBaseUrl();
}

@Override
protected RestAdapter.Builder createRestAdapterBuilder() {
    RestAdapter.Builder builder = new RestAdapter.Builder().setRequestInterceptor(
            new RequestInterceptor() {
                @Override
                public void intercept(RequestFacade request) {
                    request.addHeader(Const.HEADER_DEVICE_TYPE_KEY,
                            Const.HEADER_DEVICE_TYPE_VALUE);
                }
            }
    );
    builder.setEndpoint(getServerUrl()).setConverter(getConverter());
    return builder;
}

}

Ответ 1

Я споткнулся здесь с похожим вопросом и в конце концов нашел ответ в другом месте. Если бы здесь был более полный пример, я бы сэкономил некоторое время, поэтому я вернулся к нему, чтобы опубликовать то, что сработало для меня на всякий случай, если оно поможет другим:

Адаптер с увеличенным таймаутом чтения

    // create client
    OkHttpClient okHttpClient = new OkHttpClient();
    okHttpClient.setReadTimeout(60 * 1000, TimeUnit.MILLISECONDS);

    // create rest adapter using the client above
    RestAdapter restAdapter = new RestAdapter.Builder()
            .setEndpoint(getBaseApiUrl())
            .setClient(new OkClient(okHttpClient))
            // this gson converter below is optional. We use it for parsing dates and enums
            .setConverter(new GsonConverter(createApiGson()))
            .setLogLevel(getRetrofitLogLevel())
            .build();

ПРИМЕЧАНИЕ: для нас getBaseApiUrl() возвращает что-то вроде: https://some.company.com/api/
и getRetrofitLogLevel() возвращает либо RestAdapter.LogLevel.FULL, либо RestAdapter.LogLevel.NONE в зависимости от того, какой вкус приложения создан.

Наконец, это основные зависимости, которые заставляют все работать:

Ключевые зависимости

dependencies {
    ...
    compile "com.squareup.retrofit:retrofit:1.5.0"
    compile "com.squareup.retrofit:retrofit-mock:1.5.0"
    compile "com.squareup.okhttp:okhttp:1.5.4"
    compile "com.google.code.gson:gson:2.2.4"
    ...
}

Ответ 2

В вашей службе расширения RetrofitSpiceService вам необходимо переопределить createRestAdapterBuilder().

 @Override
 protected Builder createRestAdapterBuilder() {
    Builder builder = super.createRestAdapterBuilder();
    builder.setClient(new CustomClient());
    return builder;
  }

CustomClient - это класс, который вам нужно написать самостоятельно, чтобы предоставить свои собственные тайм-ауты. Если вы используете OkHttp, посмотрите на ссылку OkClient по умолчанию: https://github.com/square/retrofit/blob/43b7ea14e5aca1d710deccb95b79484b03e99bb9/retrofit/src/main/java/retrofit/client/OkClient.java

Ответ 3

Я не знаю о robospice, но с модификацией 2+ и okhttp3 + вы должны установить нового клиента следующим образом.

OkHttpClient okHttpClient = new OkHttpClient();
Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(Constantes.URL_DOMAIN)
            .addConverterFactory(GsonConverterFactory.create())
            .client(okHttpClient.newBuilder().connectTimeout(Constantes.TIMEOUT, TimeUnit.SECONDS).readTimeout(Constantes.TIMEOUT, TimeUnit.SECONDS).writeTimeout(Constantes.TIMEOUT, TimeUnit.SECONDS).build())
            .build();

импортируйте это в свой модуль build.gradle:

compile 'com.squareup.retrofit2:retrofit:2.0.0-beta3'
compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta3'
compile 'com.squareup.okhttp3:okhttp:3.0.0-RC1'