Search code examples
androidrobospice

RoboSpice - Not getting Cache Data


I am using RoboSpice to making web-service calls as ,below.

spiceManager.execute(request, lastRequestCacheKey,
                DurationInMillis.ONE_DAY, this);

Bu each time , it makes network request using loadDataFromNetwork() .

Seems Cache data is empty.Got this message "Cache content not available or expired or disabled"

What i am doing wrong?


Solution

  • Solved. For somebody looking for the same , please have a read.


    • From the RoboSpice starter guides , it is supposed to create custom Request (SpringAndroidSpiceRequest ; Based on the Model object) for each Web-Service Request.
    • But I have a lot of Web-Service Requests & different Model classes.So , if we create separate Request for each Model , code structure will become messy.
    • So ,Created a generic Request.
    • But , I was unable get data from cache.So just override getResultType() .

      @Override
      public Class<Object> getResultType() {
          return (Class<Object>) clazz;
      }
      

    Here is the complete code.

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

    Initiate Web-Service Request and get Response callbacks , as below.

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