Мне нужно получать сообщения от службы за заданный интервал.
Я делаю запрос в свой сервис, где я указываю ОТ ОТ и ДО даты. Но служба запускается с даты ОТ и отправляет до 2000 сообщений, а затем возвращает мне эти 2000 сообщений, не более, даже если дата ТО не достигнута.
Так что, если я хочу получить все сообщения, я должен проверить каждый ответ, и если есть 2000 сообщений, то мне нужно сделать еще один запрос, в котором я указываю дату ОТ в качестве даты последнего возвращенного сообщения. И так до тех пор, пока я не доберусь до даты.
Скажем, метод выглядит следующим образом:
public void getMessages(Date from, Date to, Callback<List<Message>> onSuccess);
Итак, я попытался написать это так:
List<Message> allMessages = new ArrayList<>();
getMessages(fromDate, toDate, messages -> {
//save all the messages returned
allMessages.addAll(messages);
if(messages.size()==2000){
//get the last message date
Date nextDate = messages.get(messages.size() - 1).getDateTime();
//query next messages
getMessages(nextDate, to, onSuccess); //and here I am screwed in what to put in the onSuccess again...
}
});
Как это сделать, чтобы он продолжал определенное количество шагов или остановился, когда он наконец достигнет даты TO? Я даже могу изменить метод getMessages (), но я получаю данные из HTTP-запроса, поэтому это необходимо сделать с помощью Callback.
UPDATE:
Спасибо за все ответы, на основе которых я нашел простое решение.
Я создал такой метод:
private void checkMessages(List<Message> messages, Date toDate, List<Message> allMessages) {
// save all the messages returned
allMessages.addAll(messages);
if (messages.size() == 2000) {
// get the last message date
Date nextDate = messages.get(messages.size() - 1).getDateTime();
// query next messages
getMessages(nextDate, toDate,
msgs -> checkMessages(msgs, toDate, allMessages));
} else {
// else we are finished
messageTable.setMessages(allMessages);
}
}
и я использовал этот метод в обратном вызове:
List<Message> allMessages = new ArrayList<>();
getMessages(fromDate, toDate,
messages -> checkMessages(messages, toDate, allMessages));
Это определенно не идеально, но, похоже, работает.