[英]Detect when user finished writing - Thread.sleep() called in loop
我想構建一個搜索,在用戶完成編寫時向您顯示結果。
如果我必須在本地數據庫中搜索,我會在每次用戶釋放密鑰時觸發搜索。
在我的情況下,我必須將Web請求發送到公開搜索功能的API點。 服務器每個分鍾只允許每分鍾20次請求。
所以,我編寫了一個Thread,用於檢測用戶何時完成寫入:
碼:
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.