亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

步數不確定的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 關注
  • 162 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號