我需要在给定的时间间隔内从服务获取消息。
我向我的服务提出了要求,在此我指定了FROM日期和TO日期。但是该服务从FROM日期开始,直到2000条消息,然后即使没有到达TO日期,也不再向我返回那2000条消息。
因此,如果要获取所有消息,则必须检查每个响应,如果有2000条消息,则需要发出另一个请求,在其中将FROM日期指定为最后一条返回消息的日期。依此类推,直到我到达TO日期为止。
让我们说这个方法看起来像这样:
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来完成。
更新: 感谢您提供所有答案,并根据这些答案提出了一个简单的解决方案。
我创建了这样的方法:
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));
这绝对不是理想的选择,但似乎可行。
答案 0 :(得分:0)
怎么样?
git config --global http.proxy http://proxyUsername:proxyPassword@aaa.ccc.com:port
答案 1 :(得分:0)
您可以使用Predicate
而不是回调,来决定是否需要拨打另一个电话。
我在这里演示带有线程的异步服务调用。 1 。这可能对您不起作用。如果您可以向我们展示一旦服务返回响应,您如何调用回调,那将更有帮助。
public void getMessages(Date from, Date to, Predicate<List<Message>> shouldMakeAnotherCall) {
new Thread(() -> {
List<Message> messages = //Call service
if (shouldMakeAnotherCall.apply(messages)) {
getMessages(from, to, shouldMakeAnotherCall);
}
}).start();
}
Predicate<List<Message>> shouldMakeAnotherCall = listOfMessages -> listOfMessages.size() == 2000;
getMessages(from, to, shouldMakeAnotherCall);
1 这会进行后续调用,每个调用都会创建一个新线程,因此效果不佳。