为可观察列表中的每个项目调用另一个可观察对象

时间:2020-01-31 02:44:47

标签: java rx-java

俗话说RxJava中,永远不要在订阅中进行订阅,但是只是为了说明问题(请原谅较长的代码段):

HttpClient httpClient = new HttpClient(NOTES_URL);
Single<HttpResponse<JsonNode>> firstPostObservable = httpClient.post();
Single<List<JSONObject>> singleJSONObjectList = firstPostObservable.flatMap(httpResponse -> {
    List<JSONObject> noteObjects = new LinkedList<JSONObject>();
    if(httpResponse.getStatus() == 200) {
        JsonNode responseNode = httpResponse.getBody();
        JSONArray notes = responseNode.getObject().getJSONArray("notes");
        for(int i=0;i<notes.length();i++) {
            JSONObject noteObject = notes.getJSONObject(i);
            noteObjects.add(noteObject);
        }
    }
    return Observable.fromIterable(noteObjects).toList();
});

singleJSONObjectList.subscribe(jsonObjects -> {
    jsonObjects.forEach(noteObject -> {
        String id = noteObject.getString("id");
        String title = noteObject.getString("title");
        String content = noteObject.getString("content");
        JSONObject resourceObject = noteObject.getJSONObject("resource");
        String fileGUID = null;
        if(resourceObject != null) {
            fileGUID = resourceObject.getString("fileGUID");
        }
        HttpClient imageHttpClient = new HttpClient(IMAGE_GENERATOR_URL);
        imageHttpClient.getParams().put("guid", fileGUID);
        imageHttpClient.setBody(new JSONObject());
        Single<HttpResponse<JsonNode>> secondPostObservable = imageHttpClient.post();
        secondPostObservable.subscribe(jsonNodeHttpResponse -> {
            // Build the UI component
            JsonNode responseNode = jsonNodeHttpResponse.getBody();
            JSONObject imageObject = responseNode.getObject().getJSONObject("image");
            String base64 = imageObject.getString("base64");
            Blog blogModel = new Blog(title);
            blogModel.setId(id);
            blogModel.setBase64Image(base64);
            blogModel.setContent(content);
            BlogSection blogSection = blogSections.get();
            blogSection.setModel(blogModel);
            blogs.add(blogSection);
        });
    });
}, error -> {
    Console.error("Error loading notes");
}); 

此代码的目标是构建UI组件:

背景

  1. 通过httpClient调用NOTES_URL会返回注释数据(标题,内容等),但附件图像除外。
  2. 附件图像是通过IMAGE_GENERATOR_URL提取的,而IMAGE_GENERATOR_URL是通过imageHttpClient
  3. 提取的

因此,对于每个JSONObject noteObject,必须通过imageHttpClient对图像生成器API进行调用,该生成器会生成 base64 图像,该图像中将完成构建图像所需的数据UI组件:标题,内容和图像。

这里的问题是如何为可观察列表中的每个项目调用另一个可观察对象?

有关代码段,如何使用RxJava正确实现?

0 个答案:

没有答案