增加调用 RoboSpice 服务的 loadDataFromNetwork() 的时间
Increase time of invoking loadDataFromNetwork() of RoboSpice service
我将 RoboSpice 与 OkHttpClient 模块 (OkHttpSpiceService) 一起用于相当长时间的请求。为此,我需要增加 http 客户端的超时时间,所以我将它们设置为 120 秒。
@Override
protected OkHttpClient createOkHttpClient() {
OkHttpClient okHttpClient = super.createOkHttpClient();
okHttpClient.setConnectTimeout(120, TimeUnit.SECONDS);
okHttpClient.setReadTimeout(120, TimeUnit.SECONDS);
okHttpClient.setWriteTimeout(120, TimeUnit.SECONDS);
return okHttpClient;
}
我不使用缓存选项所以我通过
调用SpiceRequest
getSpiceManager().execute(spiceRequest, this);
此 SpiceService 调用后 loadDataFromNetwork()
每 30 秒(3 次)当没有响应或在短时间内无法访问时。
是否有可能增加或更改调用loadDataFromNetwork()
的时间?我知道我会在一分钟后得到回复,但使用这种方法我无法获得正确的回复。
默认情况下,RoboSpice 使用这样的 DefaultRetryPolicy:
/** The default number of retry attempts.*/
public static final int DEFAULT_RETRY_COUNT = 3;
/** The default delay before retry a request (in ms). */
public static final long DEFAULT_DELAY_BEFORE_RETRY = 2500;
您可以做的是通过扩展 DefaultRetryPolicy class 并重写这两个方法来实现您自己的重试策略:
public class CustomRetryPolicy extends DefaultRetryPolicy {
@Override
public int getRetryCount() { return 1; }
@Override
public long getDelayBeforeRetry() { return 120L * 1000; }
}
您可以像这样使用自定义重试策略:
spiceRequest.setRetryPolicy(new CustomRetryPolicy());
I do not use caching option so I call SpiceRequest by getSpiceManager().execute(spiceRequest, this);
顺便说一句,这不会阻止 RoboSpice 使用缓存。要真正阻止 SpiceService 使用缓存,您需要在自己的 OkHttpSpiceService
实现中覆盖 createCacheManager
方法,如下所示:
public class MyOkHttpSpiceService extends OkHttpSpiceService {
@Override
public CacheManager createCacheManager(Application application) {
// Just return an empty CacheManager
return new CacheManager() {
@Override
public <T> T saveDataToCacheAndReturnData(T data, Object cacheKey) throws CacheSavingException, CacheCreationException {
return data;
}
};
}
}
av_lee提供的答案是正确的,但是为RoboSpice定义自定义重试策略的方法不正确。上面提到的代码将导致在失败的情况下无限重试调用。 RoboSpice 将始终使用 getRetryCount() 返回的值,并在重试后将其递减,但下次它将再次获得值 1,依此类推。
实现自定义重试策略的正确方法是设置 DefaultRetryPolicy 的值 class.
public class CustomRetryPolicy extends DefaultRetryPolicy {
public CustomRetryPolicy(int retryCount) {
super(retryCount, DEFAULT_DELAY_BEFORE_RETRY, DEFAULT_BACKOFF_MULT);
}
}
在上面的代码中,retryCount 是您希望为您的请求重试的次数,以及使用重试和退避乘数之前延迟的默认值。您可以为这三个中的任何一个使用您的首选值。
我将 RoboSpice 与 OkHttpClient 模块 (OkHttpSpiceService) 一起用于相当长时间的请求。为此,我需要增加 http 客户端的超时时间,所以我将它们设置为 120 秒。
@Override
protected OkHttpClient createOkHttpClient() {
OkHttpClient okHttpClient = super.createOkHttpClient();
okHttpClient.setConnectTimeout(120, TimeUnit.SECONDS);
okHttpClient.setReadTimeout(120, TimeUnit.SECONDS);
okHttpClient.setWriteTimeout(120, TimeUnit.SECONDS);
return okHttpClient;
}
我不使用缓存选项所以我通过
调用SpiceRequestgetSpiceManager().execute(spiceRequest, this);
此 SpiceService 调用后 loadDataFromNetwork()
每 30 秒(3 次)当没有响应或在短时间内无法访问时。
是否有可能增加或更改调用loadDataFromNetwork()
的时间?我知道我会在一分钟后得到回复,但使用这种方法我无法获得正确的回复。
默认情况下,RoboSpice 使用这样的 DefaultRetryPolicy:
/** The default number of retry attempts.*/
public static final int DEFAULT_RETRY_COUNT = 3;
/** The default delay before retry a request (in ms). */
public static final long DEFAULT_DELAY_BEFORE_RETRY = 2500;
您可以做的是通过扩展 DefaultRetryPolicy class 并重写这两个方法来实现您自己的重试策略:
public class CustomRetryPolicy extends DefaultRetryPolicy {
@Override
public int getRetryCount() { return 1; }
@Override
public long getDelayBeforeRetry() { return 120L * 1000; }
}
您可以像这样使用自定义重试策略:
spiceRequest.setRetryPolicy(new CustomRetryPolicy());
I do not use caching option so I call SpiceRequest by
getSpiceManager().execute(spiceRequest, this);
顺便说一句,这不会阻止 RoboSpice 使用缓存。要真正阻止 SpiceService 使用缓存,您需要在自己的 OkHttpSpiceService
实现中覆盖 createCacheManager
方法,如下所示:
public class MyOkHttpSpiceService extends OkHttpSpiceService {
@Override
public CacheManager createCacheManager(Application application) {
// Just return an empty CacheManager
return new CacheManager() {
@Override
public <T> T saveDataToCacheAndReturnData(T data, Object cacheKey) throws CacheSavingException, CacheCreationException {
return data;
}
};
}
}
av_lee提供的答案是正确的,但是为RoboSpice定义自定义重试策略的方法不正确。上面提到的代码将导致在失败的情况下无限重试调用。 RoboSpice 将始终使用 getRetryCount() 返回的值,并在重试后将其递减,但下次它将再次获得值 1,依此类推。 实现自定义重试策略的正确方法是设置 DefaultRetryPolicy 的值 class.
public class CustomRetryPolicy extends DefaultRetryPolicy {
public CustomRetryPolicy(int retryCount) {
super(retryCount, DEFAULT_DELAY_BEFORE_RETRY, DEFAULT_BACKOFF_MULT);
}
}
在上面的代码中,retryCount 是您希望为您的请求重试的次数,以及使用重试和退避乘数之前延迟的默认值。您可以为这三个中的任何一个使用您的首选值。