簡體   English   中英

檢測用戶何時完成寫入 - 在循環中調用Thread.sleep()

[英]Detect when user finished writing - Thread.sleep() called in loop

我想構建一個搜索,在用戶完成編寫時向您顯示結果。

如果我必須在本地數據庫中搜索,我會在每次用戶釋放密鑰時觸發搜索。

在我的情況下,我必須將Web請求發送到公開搜索功能的API點。 服務器每個分鍾只允許每分鍾20次請求。

所以,我編寫了一個Thread,用於檢測用戶何時完成寫入:

  • (雖然是真的)
  • 保存搜索框文本
  • 等待400ms
  • 檢查搜索框文本是否與之前保存的文本相同

碼:

private void checkIfUserFinishedWritingFunction() {
        while(true) {
            String previousText = textField.getText();

        try {
            Thread.sleep(400);
        } catch (InterruptedException ex) {
            return;
        }

        String actualText = textField.getText();

        //WHEN USER FINISHED WRITING...
        if(previousText.equals(actualText)) {
            //IF SEARCHBOX ISN'T EMPTY
            if(!textField.getText().trim().isEmpty()) {
                //START A THREAD THAT SENDS WEB REQUEST
            }
            //IF SEARCHBOX IS EMPTY...
            else {
                //HIDE RESULTS POPUP
                if(resultsList.isShowing())
                    resultsList.hide();
            }
        return;
}}}

NetBeans告訴我在循環中調用的Thread.sleep()可能很危險。 我認為這是因為成本,並且我的循環運行每400毫秒。

我該如何修復這個算法?

我認為這是因為成本,並且我的循環運行每400毫秒。

實際上,這是因為當您在基於GUI的應用程序中調用sleep時,您可能會導致事件偵聽器線程凍結。

(如果這不在事件監聽器線程上,那么調用hide可能會對線程產生安全隱患。)

一個更好的選擇是在文本框上使用事件監聽器組合更新事件,注意自上次發送查詢以來的時間,以及類似ScheduledExecutorService

調用Thread.sleep()並不昂貴,但可能會創建一個線程。

根據經驗,如果你編寫調用sleep()代碼,那么你要么(A)嘗試做一些以前沒有人想過的事情,要么(B)重新發明你可以免費獲得的東西,或者(C)犯了一個錯誤。

對於我們大多數人來說,通常是(B)或(C)或兩者兼而有之。

在這種情況下,您可以使用javax.swing.Timer從事件調度線程(EDT)本身進行輪詢,而不是專用線程來輪詢GUI狀態。 有關示例,請參閱Java教程: https//docs.oracle.com/javase/tutorial/uiswing/misc/timer.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM