为了账号安全,请及时绑定邮箱和手机立即绑定

步数不确定的Java回调地狱

步数不确定的Java回调地狱

米琪卡哇伊 2021-09-03 14:30:38
我需要在给定的时间间隔内从服务中获取消息。我向我的服务提出请求,在那里我指定了 FROM 日期和 TO 日期。但是该服务从 FROM 日期开始,最多 2000 条消息,然后它返回给我那 2000 条消息,即使没有达到 TO 日期,也不会更多。因此,如果我想获取所有消息,我必须检查每个响应,如果有 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 请求中获取数据,因此需要通过回调来完成。更新: 感谢所有答案,基于它们我想出了一个简单的解决方案。我创建了一个这样的方法: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));这绝对不是理想的,但它似乎正在起作用。
查看完整描述

2 回答

?
猛跑小猪

TA贡献1858条经验 获得超8个赞

除了回调,您还可以使用 一个Predicate来决定是否需要再次拨打电话。


我在这里1演示了带有 Thread 的异步服务调用。这可能适合您,也可能不适合。如果您能向我们展示在服务返回响应后如何调用回调,将会更有帮助。


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这使得后续调用每个都创建一个新线程,因此不是一个很好的调用。


查看完整回答
反对 回复 2021-09-03
?
不负相思意

TA贡献1777条经验 获得超10个赞

这个怎么样?


    List<Message> allMessages = new ArrayList<>();

    Callback<List<Message>> onSuccessCallback = 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, toDate, onSuccessCallback);

           }

    };

    getMessages(fromDate, toDate, onSuccessCallback);


查看完整回答
反对 回复 2021-09-03
  • 2 回答
  • 0 关注
  • 136 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信