【问题标题】:RxJava, Retrofit - changing the response into ArrayAdapter item object?RxJava,Retrofit - 将响应更改为 ArrayAdapter 项目对象?
【发布时间】:2016-05-08 10:03:20
【问题描述】:

我在 Android 中使用 RxJava。 我正在尝试从服务器获取地点的响应。一切正常:

这是我的改造界面:

@GET("/some/path")
Observable<Response> search(@QueryMap Map map);

我是这样处理的:

    endpointService.search(requestMap)
            .onErrorReturn(throwable -> {
                L.e(TAG, "problems");
                return null;
            })
            .subscribe(rxBus::send);

如您所见,我向感兴趣的各方发布了一个事件 (RxBus),在本例中是一个片段:

    rxBus.register(Response.class)
            .subscribe(event -> {
                L.d(TAG, "Received search response");
            });

现在它可以工作了。我不确定,这个处理 REST 调用的“想法”不会在灾难中结束(我是 RxJava 的新手),但现在看起来还不错......

无论如何 - 这种反应是巨大的。我只需要一份姓名和地址列表。这个响应给了我一个带有大量附加数据的 huuuge JSON。

我的想法是用map(或flatMap,我仍然无法知道其中的区别)来改变它。 我已经实现了类似

    .map(event -> {
             List<SearchItem> list = new ArrayList<>();
             for (Response r : event.getItems) {
                  list.add(new Item(r.getName, r.getAddress));
              }
                 return list;
            }
         )

它有效,但我不确定 foreach-ing 是否有点“老派”。 IDE 说我不能使用 collect call 但是我从来没有使用过它,自动更正让事情变得更糟:)

那么 - 我是否以正确的方式处理这整个事情?

编辑:

我修改了我的代码:

rxBus.register(Response.class)
            .subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
            .map(event -> event.getResponse().getList())
            .flatMap(Observable::from)
            .map(v -> new SearchItem(v.getName(), v.getAddress())
            .toList()
            .subscribe(event -> {
                L.w(TAG, "Stuff happens");
            });

我不知道发生了什么,但这段代码不再有效。嗯 - 有点。如果没有.toList(),它会多次启动该日志。但是 - 没有任何反应。我做错了吗?

【问题讨论】:

  • 如果你只是用event.getItems()的返回值初始化你的ArrayAdapter会起作用吗?关于flatMapmap - 你可以总是使用flatMap,你可以使用map(只是使用不同的Func1),但反之则不然。另外:stackoverflow.com/questions/22847105/…reddit.com/r/androiddev/comments/2y8exc/…stackoverflow.com/questions/33830063/…
  • 哦,抱歉,我刚刚看到您正在循环中创建新的Items...没关系。在那种情况下,我认为你正在做的事情很好。但是,您可以一直使用 Rx,然后 (1) mapList&lt;Response&gt; 退出事件,(2) 使用 flatMapObservable&lt;List&lt;Response&gt;&gt; 转换为 Observable&lt;Response&gt; , 和 (3) map 他们每个人到一个Item

标签: android rx-java


【解决方案1】:

我认为一般方法很好。您可以通过以下方式稍微改进对项目的处理:

...
.map(Event::getItems)
.flatMap(Observable::from)
.map(response -> new Item(response.getName(), response.getAddress()))
.toList()
...

我假设您使用 retrolambda。在这种情况下,IDE 建议(“收集”)将 Java 8 Streams API 语法应用于 for 循环,这在 Android 中不起作用。

编辑

我没有意识到第一个选项不适用于从不发出 onCompleted 事件的热可观察案例,toList() 操作员需要知道何时停止组装列表。

感谢@david.mihola,这个案例有一个不同的选择:

...
.flatMap(event -> Observable.from(event.getResponse().getList())
                            .map(item -> new SearchItem(v.getName(), v.getAddress()))
                            .toList())
...

【讨论】:

  • 谢谢,我想过类似的事情,但我最近才知道.toList() :)
  • 好吧,我设法做错了,这段代码不再有效。我不知道为什么,我已经编辑了我的帖子。
  • 您可以尝试将Observable.from(event.getResponse().getList()).map(...).toList() 放在第一个map 中 - 这应该确保一个Event 映射到一个List&lt;Item&gt; .
  • @david.mihola 谢谢,只是我们需要flatMap。我会修改答案
  • @a_dzik 哦,在这种情况下,编译器可能无法找出泛型。处理此问题的另一种方法是调用Observable.from,如Observable.&lt;ResponseItem&gt;from(...)
猜你喜欢
  • 2020-04-18
  • 2013-02-28
  • 2018-02-27
  • 2016-10-28
  • 2015-12-13
  • 1970-01-01
  • 1970-01-01
  • 2016-03-21
  • 2017-12-03
相关资源
最近更新 更多