0

我将 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);

在此 SpiceServiceloadDataFromNetwork()每 30 秒(3 次)调用后,响应未出现或在此短时间内无法访问。

是否有可能增加或更改调用时间loadDataFromNetwork()?我知道我在一分​​钟后得到响应,但使用这种方法我无法得到正确的响应。

4

2 回答 2

0

av_lee 提供的答案是对的,但是为 RoboSpice 定义自定义重试策略的方法不正确。上面提到的代码将导致在失败的情况下无限重试调用。RoboSpice 将始终使用 getRetryCount() 返回的值,并在重试后将其递减,但下次它会再次获得值 1,依此类推。实现自定义重试策略的正确方法是设置 DefaultRetryPolicy 类的值。

public class CustomRetryPolicy extends DefaultRetryPolicy {
  public CustomRetryPolicy(int retryCount) {
      super(retryCount, DEFAULT_DELAY_BEFORE_RETRY, DEFAULT_BACKOFF_MULT);
  } 
}

在上面的代码中,retryCount 是您希望为请求重试的次数,以及使用重试和退避乘数之前的延迟默认值。您可以将您的首选值用于这三个中的任何一个。

于 2016-10-27T06:23:50.707 回答
0

默认情况下,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 类并覆盖这两个方法来实现自己的重试策略:

public class CustomRetryPolicy extends DefaultRetryPolicy {
    @Override
    public int getRetryCount() { return 1; }

    @Override
    public long getDelayBeforeRetry() { return 120L * 1000; }
}

您可以像这样使用自定义重试策略:

spiceRequest.setRetryPolicy(new CustomRetryPolicy());

看看这里: https ://github.com/stephanenicolas/robospice/wiki/Advanced-RoboSpice-Usages-and-FAQ#how-can-i-setup-a-retry-policy-for-failed-requests-

我不使用缓存选项,所以我调用 SpiceRequestgetSpiceManager().execute(spiceRequest, this);

顺便说一句,这不会阻止 RoboSpice 使用缓存。要真正阻止 SpiceService 使用缓存,您需要createCacheManager在自己的OkHttpSpiceService实现中重写方法,如下所示:

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

}

于 2016-04-13T20:50:14.273 回答