【发布时间】: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,不会起作用吗?关于flatMap与map- 你可以总是使用flatMap,你可以使用map(只是使用不同的Func1),但反之则不然。另外:stackoverflow.com/questions/22847105/…reddit.com/r/androiddev/comments/2y8exc/…stackoverflow.com/questions/33830063/… -
哦,抱歉,我刚刚看到您正在循环中创建新的
Items...没关系。在那种情况下,我认为你正在做的事情很好。但是,您可以一直使用 Rx,然后 (1)map将List<Response>退出事件,(2) 使用flatMap将Observable<List<Response>>转换为Observable<Response>, 和 (3)map他们每个人到一个Item。