2016-01-20 30 views
0

下午好,我有一個問題請看看這個。我可以爲每個在EditText中輸入的字符開始一個新的線程用於搜索

我正在使用Retrofit beta 2從api中檢索數據。我有一個EditText,我想從服務器中搜索一些名字。我也得到了輸出,但例如考慮有一些名稱:

ABC,XYZ,PQR,STU等。這些是存儲在服務器中的名稱,我正在使用Retrofit beta2檢索這些名稱。

當我搜索ABC或ABC時,它會顯示結果,當我從EditText中刪除字符串時,則不顯示任何內容。

直到這裏我已經完成了。

我的問題是,當我輸入名稱快,結果是別的。

那麼,誰能告訴我如何避免這種情況。

謝謝。

回答

1

Call對象有幾個實用方法可供您使用,即isExecutedcancel來控制您的請求。

http://square.github.io/retrofit/2.x/retrofit/retrofit2/Call.html

我假設你正在使用TextWatcher。僞代碼如下:

public void afterTextChanged (Editable s) { 
    // Cancel the request first before sending it again; this way you won't have two separate calls 
    if(call != null && call.isExecuted()) { 
     call.cancel(); 
    } 

    // reinitialize call and execute it again 
} 

一般來說,這是不明智的偵聽來自用戶即時輸入產卵的行動:你應該重新考慮你的方法;最好放置一個「提交」或按鈕來執行API調用;否則你會在每個輸入有多個HTTP請求時發送垃圾郵件。

+0

雅這是正確的,但我不希望我的用戶輸入完整的字符串,而是他們可以使用建議。是的,我在這裏使用TextWatcher。 –

+0

好的,然後在發送前堅持取消,這樣你就不會有多個電話。 http://square.github.io/retrofit/2.x/retrofit/retrofit2/Call.html#cancel-- –

0

記住搜索文本例如搜索結果中的「AB」。在顯示結果之前,請檢查當前輸入的文本是否仍與搜索結果的文本相匹配,並僅使用結果(如果有)。

搜索「AB」,當前文本「ABC」 - >不顯示結果。

搜索「ABC」,當前文本「ABC」 - >顯示結果。

像這樣,它將不會影響兩個請求返回的順序,它總是隻顯示正確的結果。

0

我認爲這是不安全的start a new thread for every character

這是我在我的應用程序如何做的:

您可以使用一個隊列來存儲每一個字符串,用戶輸入。每次更改edittext時,都會在隊列中插入一個新字符串

同時,您可以通過改進來發送異步查詢。但如果改造工作正在查詢,您不會立即發送,只會將字符串放入隊列中。當你的回調函數被retrofit調用時,你可以從隊列中除去最新的一個,然後使用retrofit來查詢這個最新的查詢。

0

線程太多,會影響任何設備的性能,因爲它涉及的開銷會消耗大量的資源。

爲每個字符開始一個新的線程並不是可取的,要回答你的問題,每個線程應該不斷檢查字符的變化,當你輸入fast時,它意味着會跳過一些結果,但最終會顯示結果正確的最後一個字符串。

相關問題