android - 使用 RoboSpice 将多个 Web 服务聚合到一个响应中

标签 android robospice

我刚刚开始用 RoboSpice 替换我自己的网络请求代码并遇到了拦截者。我需要做的是发出一个返回 json 的请求,然后这个 json 给我 X 个新的 url:s,我需要从中加载额外的数据才能完成请求。

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

“支持不同 Web 服务的聚合”来自 RoboSpice GitHub page

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

或者:有谁知道我是否可以启动一个 SpiceRequest,然后在 SpiceService 中处理时启动 X 个新的 SpiceRequest,我猜 RoboSpice 无法自行合并我的数据进行实际的合并不是这里的问题。重要的是,我可以在后台运行的 SpiceService 中执行此操作,这样即使 Activity/fragment 被销毁/重新创建,它也能完成。

最佳答案

由于似乎没有人有实现这一目标的好方法,因此我添加了我的解决方案(不是最好的解决方案),以防其他人有类似的需求。

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

关于android - 使用 RoboSpice 将多个 Web 服务聚合到一个响应中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22714142/

相关文章:

java - 从 Google Fit API 获取数据时不显示瞬时读数

android - 使用 RoboSpice 进行异步线程

android - 在 Activity 中播放视频 youtube 时发生 java.lang.NoClassDefFoundError

android - 在 android GCM 中获取相同的消息

android - Robospice/Retrofit后台服务访问数据库

android - 我如何让 Robospice 将来自 Retrofit 和 OKHttp 的 200 响应以外的任何其他内容视为错误

android - 使用 Jackson 和 Spring 在 Robospice 中为 REST 请求启用缓存

java - 改造:用一个元素反序列化数组时出错: "out of START_ARRAY token"

java - 如何在 SoundPool 类中使用 stop() 方法?

java - WorkManager 适用于 Oreo 但不适用于 Lollipop