使用RoboSpice将多个Web服务聚合为一个响应

时间:2014-03-28 13:23:58

标签: android robospice

我刚开始用RoboSpice替换我自己的网络请求代码并遇到了阻止程序。我需要做的是创建一个将返回一个json的请求,然后这个json给了我许多新的url:s,我需要加载其他数据才能完成请求。

我更愿意这样做,从片段的角度来看,它只是一个spiceRequest,而且我从RoboSpice GitHub page解释它,它以某种方式支持它。

"支持从RoboSpice GitHub page

汇总不同的网络服务"

有没有人做过类似的事情,想给我一些关于如何实现这个目标的信息?

另外:有没有人知道我是否可以启动一个spiceRequest,然后在spiceService中处理时启动X许多新的spiceRequests,我猜测RoboSpice无法合并我的它所拥有的数据以及进行实际合并的问题不是这里的问题。重要的是,我仍然可以在后台运行的spiceService中执行此操作,以便即使活动/片段被破坏/重新创建也能完成。

2 个答案:

答案 0 :(得分:2)

由于似乎没有人能够很好地实现这一目标,所以我正在添加我的解决方案(不是最好的解决方案)以防其他人有类似的需求。

我继承SpringAndroidSpiceRequest并在loadDataFromNetwork()中获取RestTemplate并简单地生成x许多请求并将它们合并为我自己,然后将组合数据作为spiceRequest的结果返回。

当我找到一种更好的方法时,我会替换这段代码但是现在它可以完成这项工作。

public class LargeSpiceRequest extends SpringAndroidSpiceRequest<LargeResponse>{
    private String mUrl;

    public LargeSpiceRequest(String url) {
        super(LargeResponse.class);
        mUrl = url;
    }

    @Override
    public LargeResponse loadDataFromNetwork() throws Exception {
        RestTemplate restTemplate = getRestTemplate();

        ResponseEntity<LargeResponse> largeResponseResponseEntity = restTemplate.exchange(URI.create(mUrl), HttpMethod.GET, null, LargeResponse.class);
        LargeResponse largeResponse = largeResponseResponseEntity.getBody();

        ArrayList<SubRequest> subRequests = largeResponse.getSubRequests();

        for(SubRequest subRequest : subRequests){
            try{
                String url = subRequest.getUrl();
                ResponseEntity<SubRequestResponse> subRequestResponseEntity = restTemplate.exchange(URI.create(url), HttpMethod.GET, null, SubRequestResponse.class);
                SubRequestResponse subRequestResponse = subRequestResponseEntity.getBody();

                // merge somethingResponse with largeResponse
                largeResponse.mergeIn(subRequestResponse);
            } catch (RestClientException e) {
                // Handle this if you want
            }
        }

        // the merged largeResponse will be stored in the cache
        return largeResponse;
    }
}

答案 1 :(得分:0)

好的,如果只有两个服务怎么办?好吧,听起来粗糙,但如果你有几个端点,你应该一直重新启动你的服务。在某些情况下,它不起作用。 所以,如果你有两个端点想到两个Robospice服务实例。你觉得怎么样?