Android RoboSpice-无法获取缓存数据

Android RoboSpice-无法获取缓存数据,android,robospice,Android,Robospice,我习惯于进行web服务调用,如下所示 spiceManager.execute(request, lastRequestCacheKey, DurationInMillis.ONE_DAY, this); Bu每次,它都使用loadDataFromNetwork()发出网络请求 缓存数据似乎为空。收到此消息“缓存内容不可用、过期或禁用” 我做错了什么?已解决。如果有人想找同样的,请阅读。 从中,应该为每个Web服务请求创建自定义请求(基于模型对象的Sprin

我习惯于进行web服务调用,如下所示

spiceManager.execute(request, lastRequestCacheKey,
                DurationInMillis.ONE_DAY, this);
Bu每次,它都使用
loadDataFromNetwork()
发出网络请求

缓存数据似乎为空。收到此消息“缓存内容不可用、过期或禁用”

我做错了什么?

已解决。如果有人想找同样的,请阅读。
  • 从中,应该为每个Web服务请求创建自定义请求(基于模型对象的SpringAndroidSpiceRequest)
  • 但是我有很多Web服务请求&不同的模型类。因此,如果我们为每个模型创建单独的请求,代码结构将变得混乱
  • 因此,创建了一个通用请求
  • 但是,我无法从缓存中获取数据,所以只需重写
    getResultType()

    @覆盖
    公共类getResultType(){
    返回(类)clazz;
    }
    

这是完整的代码。
公共类WebServiceRequest扩展了SpringAndroidSpiceRequest{
私有字符串url;
专用int超时时间=15000;
课堂讨论;
HTTPMethod-HTTPMethod;
私有多值映射多值映射;
公共WebServiceRequest(HTTPMethod HTTPMethod、字符串标记、字符串url、类clazz、@Nullable MultiValueMap MultiValueMap){
super(Object.class);
this.httpMethod=httpMethod;
this.token=token;
this.url=url;
this.clazz=clazz;
this.multiValueMap=multiValueMap;
}
@凌驾
公共对象loadDataFromNetwork(){
对象响应=null;
试一试{
if(this.httpMethod==httpMethod.GET){
Uri.Builder-uriBuilder=Uri.parse(this.url.buildon();
字符串URL=uriBuilder.build().toString();
response=getRestTemplate().getForObject(URL,clazz);
}否则{
RestTemplate RestTemplate=新的RestTemplate(true);
restemplate.getMessageConverters().add(新表单httpMessageConverter());
restemplate.getMessageConverters().add(新映射JacksonHttpMessageConverter());
restemplate.getMessageConverters().add(新的StringHttpMessageConverter());
HttpHeaders requestHeaders=新的HttpHeaders();
requestHeaders.setContentType(MediaType.APPLICATION\u FORM\u URLENCODED);
HttpEntity requestEntity=新的HttpEntity(this.multiValueMap,requestHeaders);
//测试URL:http://posttestserver.com/post.php  
response=restemplate.postForObject(this.url、requestEntity、clazz);
}
manageTimeOuts(getRestTemplate());
返回响应;
}捕获(异常超时异常){
返回响应;
}
}
@凌驾
公共类getResultType(){
返回(类)clazz;
}
私有void管理超时(RestTemplate RestTemplate){
//为请求设置超时
ClientHttpRequestFactory=restTemplate.getRequestFactory();
if(HttpComponents客户端HttpRequestFactory的工厂实例){
HttpComponents客户端HttpRequestFactory高级工厂=(HttpComponents客户端HttpRequestFactory)工厂;
设置连接超时(超时时间);
设置读取超时(超时时间);
}else if(SimpleClientHttpRequestFactory的工厂实例){
SimpleClientHttpRequestFactory advancedFactory=(SimpleClientHttpRequestFactory)工厂;
设置连接超时(超时时间);
设置读取超时(超时时间);
}
}
公共字符串createCacheKey(){
返回clazz.getName()+令牌;
}
}
启动Web服务请求并获取响应回调,如下所示

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();
    }
}
公共类HomeActivity扩展AppCompatActivity实现RequestListener{
private SpiceManager SpiceManager=新SpiceManager(
Jacksonspringandroid(服务类);
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
字符串url=”http://192.168.56.1:8080/JSONRestWebServiceExample/JavaCodeGeeks/AuthorService/authors";
WebServiceRequest请求=新的WebServiceRequest(HTTPMethod.GET,null,url,new ArrayList().getClass(),null);
字符串lastRequestCacheKey=request.createCacheKey();
执行(请求、lastRequestCacheKey、,
持续时间(百万美元,一天,本);
}
@凌驾
受保护的void onStart(){
启动(这个);
super.onStart();
}
@凌驾
受保护的void onStop(){
spiceManager.shouldStop();
super.onStop();
}
@凌驾
public void onRequestSuccess(对象){
ObjectMapper ObjectMapper=新的ObjectMapper();
ArrayList metricsResponse=objectMapper.convertValue(对象,新类型引用(){
});
if(object==null){
onRequestFailure(新的异常(“出错”);
返回;
}
}
@凌驾
公共void onRequestFailure(SpiceException){
Snackbar.make(getWindow().getDecorView().getRootView(),spiceException.getMessage(),Snackbar.LENGTH\u SHORT)
.setAction(“Action”,null).show();
}
}
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();
    }
}