【发布时间】:2020-08-17 07:09:58
【问题描述】:
这是我一直在处理的代码示例
items 包含 100 个元素,因此使用同步调用获取数据会占用大量时间。有人可以建议一种方法来提高此操作的速度,从而减少时间。 目前这需要 15-20 秒来执行。我是 rxjava 的新手,因此请尽可能提供此问题的详细解决方案。 dataResponses 包含 100 个项目中每个项目的 RouteDistance 对象。
for(int i = 0 ; i<items.size();i++){
Map<String, String> map2 = new HashMap<>();
map2.put("units", "metric");
map2.put("origin", currentLocation.getLatitude()+","+currentLocation.getLongitude());
map2.put("destination", items.get(i).getPosition().get(0)+","+items.get(i).getPosition().get(1));
map2.put("transportMode", "car");
requests.add(RetrofitClient4_RouteDist.getClient().getRouteDist(map2));
}
Observable.zip(requests, new Function<Object[], List<RouteDist>>() {
@Override
public List<RouteDist> apply(Object[] objects) throws Exception {
Log.i("onSubscribe", "apply: " + objects.length);
List<RouteDist> dataaResponses = new ArrayList<>();
for (Object o : objects) {
dataaResponses.add((RouteDist) o);
}
return dataaResponses;
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.subscribe(
new Consumer<List<RouteDist>>() {
@Override
public void accept(List<RouteDist> dataaResponses) throws Exception {
Log.i("onSubscribe", "YOUR DATA IS HERE: "+dataaResponses.toString());
recyclerViewAdapter_profile = new RecyclerViewAdapter_Profile(items,dataaResponses);
recyclerView.setAdapter(recyclerViewAdapter_profile);
}
},
new Consumer<Throwable>() {
@Override
public void accept(Throwable e) throws Exception {
Log.e("onSubscribe", "Throwable: " + e);
}
});
【问题讨论】:
-
如果 rxjava 没有帮助,你为什么要使用它?您不能只进行并行改造电话吗?
-
对不起@AlexeiKaigorodov,你能解释一下你的评论有什么帮助吗?您是否考虑过问题创建者是 RxJava 的新手并且不完全了解其所有运算符的情况?如果您有其他解决方案如何解决此问题,请提供答案。
-
我的意思是,进行异步调用是一项任务,而使用 rxjava 则完全是另一项任务。此任务需要不同的问题。我建议先解决第一个任务,然后询问如何将工作代码转换为 rxjava,希望第二个问题根本不会被问到,因为一切都已经工作了。
标签: java android rx-java retrofit2 rx-java2