RoboSpice - не получает данные кэша
Я использую RoboSpice для звонков через веб-сервис, как показано ниже.
spiceManager.execute(request, lastRequestCacheKey,
DurationInMillis.ONE_DAY, this);
Бу каждый раз делает сетевой запрос используя loadDataFromNetwork()
,
Кажется, данные кеша пустые. Получите это сообщение "Cache content not available or expired or disabled"
Что я делаю не так?
1 ответ
Решение
Решаемые. Для тех, кто ищет то же самое, пожалуйста, прочитайте.
- Из руководств для начинающих RoboSpice предполагается создать собственный запрос (SpringAndroidSpiceRequest; на основе объекта Model) для каждого запроса веб-службы.
- Но у меня много запросов веб-сервисов и разных классов моделей. Так что, если мы создадим отдельный запрос для каждой модели, структура кода станет грязной.
- Итак, создан общий запрос.
Но я не смог получить данные из кэша. Так что просто переопределить
getResultType()
,@Override public Class<Object> getResultType() { return (Class<Object>) clazz; }
Вот полный код.
public class WebServiceRequest extends SpringAndroidSpiceRequest<Object> {
private String url;
private int TIMEOUT_TIME = 15000;
Class<?> clazz;
HTTPMethod httpMethod;
private MultiValueMap multiValueMap;
public WebServiceRequest(HTTPMethod httpMethod, String Token, String url, Class<?> clazz, @Nullable MultiValueMap multiValueMap) {
super(Object.class);
this.httpMethod = httpMethod;
this.token = Token;
this.url = url;
this.clazz = clazz;
this.multiValueMap = multiValueMap;
}
@Override
public Object loadDataFromNetwork() {
Object response = null;
try {
if (this.httpMethod == HTTPMethod.GET) {
Uri.Builder uriBuilder = Uri.parse(this.url).buildUpon();
String urls = uriBuilder.build().toString();
response = getRestTemplate().getForObject(urls, clazz);
} else {
RestTemplate restTemplate = new RestTemplate(true);
restTemplate.getMessageConverters().add(new FormHttpMessageConverter());
restTemplate.getMessageConverters().add(new MappingJacksonHttpMessageConverter());
restTemplate.getMessageConverters().add(new StringHttpMessageConverter());
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
HttpEntity<?> requestEntity = new HttpEntity<Object>(this.multiValueMap, requestHeaders);
// Test URL : http://posttestserver.com/post.php
response = restTemplate.postForObject(this.url, requestEntity, clazz);
}
manageTimeOuts(getRestTemplate());
return response;
} catch (Exception timeoutException) {
return response;
}
}
@Override
public Class<Object> getResultType() {
return (Class<Object>) clazz;
}
private void manageTimeOuts(RestTemplate restTemplate) {
// set timeout for requests
ClientHttpRequestFactory factory = restTemplate.getRequestFactory();
if (factory instanceof HttpComponentsClientHttpRequestFactory) {
HttpComponentsClientHttpRequestFactory advancedFactory = (HttpComponentsClientHttpRequestFactory) factory;
advancedFactory.setConnectTimeout(TIMEOUT_TIME);
advancedFactory.setReadTimeout(TIMEOUT_TIME);
} else if (factory instanceof SimpleClientHttpRequestFactory) {
SimpleClientHttpRequestFactory advancedFactory = (SimpleClientHttpRequestFactory) factory;
advancedFactory.setConnectTimeout(TIMEOUT_TIME);
advancedFactory.setReadTimeout(TIMEOUT_TIME);
}
}
public String createCacheKey() {
return clazz.getName() + token;
}
}
Инициируйте запрос веб-службы и получите ответные обратные вызовы, как показано ниже.
public class HomeActivity extends AppCompatActivity implements RequestListener<Object> {
private SpiceManager spiceManager = new SpiceManager(
JacksonSpringAndroidSpiceService.class);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
String url = "http://192.168.56.1:8080/JSONRestWebServiceExample/JavaCodeGeeks/AuthorService/authors";
WebServiceRequest request = new WebServiceRequest(HTTPMethod.GET, null, url, new ArrayList<Model>().getClass(), null);
String lastRequestCacheKey = request.createCacheKey();
spiceManager.execute(request, lastRequestCacheKey,
DurationInMillis.ONE_DAY, this);
}
@Override
protected void onStart() {
spiceManager.start(this);
super.onStart();
}
@Override
protected void onStop() {
spiceManager.shouldStop();
super.onStop();
}
@Override
public void onRequestSuccess(Object object) {
ObjectMapper objectMapper = new ObjectMapper();
ArrayList<Model> metricsResponse = objectMapper.convertValue(object, new TypeReference<List<Model>>() {
});
if (object == null) {
onRequestFailure(new SpiceException("Something went wrong"));
return;
}
}
@Override
public void onRequestFailure(SpiceException spiceException) {
Snackbar.make(getWindow().getDecorView().getRootView(), spiceException.getMessage(), Snackbar.LENGTH_SHORT)
.setAction("Action", null).show();
}
}