RxJava2 按顺序发出项目
RxJava2 emit items in order
我正在制作一个汇率应用程序,我有一个屏幕,上面有一个图表,显示了过去 7 天内所选货币的变化。
现在我想要的是按严格的顺序发出物品。
这是我的代码:
public class GraphInteractorImpl implements GraphInteractor {
private final Retrofit retrofit;
@Inject
public GraphInteractorImpl(Retrofit retrofit) {
this.retrofit = retrofit;
}
@Override
public void downloadData(GraphListener listener) {
RestAPI api = retrofit.create(RestAPI.class);
List<String> listDates = getDates();
for (String date : listDates) {
Observable<List<ExchangeRate>> observable = api.getExchangeRatesForLast7days(date);
observable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
listener::onSuccess,
listener::onFailure
);
}
}
private List<String> getDates() { //returns last 7 days in a list
List<String> listDate = new ArrayList<>();
Calendar calendarToday = Calendar.getInstance();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH);
String today = simpleDateFormat.format(calendarToday.getTime());
Calendar calendarDayBefore = Calendar.getInstance();
calendarDayBefore.setTime(calendarDayBefore.getTime());
int daysCounter = 0;
while (daysCounter <= 7) {
if (daysCounter == 0) { // means that its present day
listDate.add(today);
} else { // subtracts 1 day after each pass
calendarDayBefore.add(Calendar.DAY_OF_MONTH, -1);
Date dateMinusOneDay = calendarDayBefore.getTime();
String oneDayAgo = simpleDateFormat.format(dateMinusOneDay);
listDate.add(oneDayAgo);
}
daysCounter++;
}
return listDate;
}
}
这段代码为我提供了正确的值,但它们没有按顺序排列,所以我在特定日期得到了错误的值。
所以我要做的是同时执行 7 个调用,我猜是使用 zip 运算符,但我还没有为此提出解决方案,因此我们将不胜感激。
API 文档可以在这里找到:http://hnbex.eu/api/v1/
所以我解决这个问题的方法是将所有 7 个可观察对象添加到列表中,然后在该列表中调用 zipIterable()
我正在制作一个汇率应用程序,我有一个屏幕,上面有一个图表,显示了过去 7 天内所选货币的变化。
现在我想要的是按严格的顺序发出物品。
这是我的代码:
public class GraphInteractorImpl implements GraphInteractor {
private final Retrofit retrofit;
@Inject
public GraphInteractorImpl(Retrofit retrofit) {
this.retrofit = retrofit;
}
@Override
public void downloadData(GraphListener listener) {
RestAPI api = retrofit.create(RestAPI.class);
List<String> listDates = getDates();
for (String date : listDates) {
Observable<List<ExchangeRate>> observable = api.getExchangeRatesForLast7days(date);
observable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
listener::onSuccess,
listener::onFailure
);
}
}
private List<String> getDates() { //returns last 7 days in a list
List<String> listDate = new ArrayList<>();
Calendar calendarToday = Calendar.getInstance();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH);
String today = simpleDateFormat.format(calendarToday.getTime());
Calendar calendarDayBefore = Calendar.getInstance();
calendarDayBefore.setTime(calendarDayBefore.getTime());
int daysCounter = 0;
while (daysCounter <= 7) {
if (daysCounter == 0) { // means that its present day
listDate.add(today);
} else { // subtracts 1 day after each pass
calendarDayBefore.add(Calendar.DAY_OF_MONTH, -1);
Date dateMinusOneDay = calendarDayBefore.getTime();
String oneDayAgo = simpleDateFormat.format(dateMinusOneDay);
listDate.add(oneDayAgo);
}
daysCounter++;
}
return listDate;
}
}
这段代码为我提供了正确的值,但它们没有按顺序排列,所以我在特定日期得到了错误的值。
所以我要做的是同时执行 7 个调用,我猜是使用 zip 运算符,但我还没有为此提出解决方案,因此我们将不胜感激。
API 文档可以在这里找到:http://hnbex.eu/api/v1/
所以我解决这个问题的方法是将所有 7 个可观察对象添加到列表中,然后在该列表中调用 zipIterable()