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();
    }
}
Другие вопросы по тегам