我有以下代碼:
Handler mHandler = new Handler(); //global variable
searchAddress.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
mHandler.removeCallbacksAndMessages(null);
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
try {
List<Address> foundAddresses = gc.getFromLocationName(newText,10);
Log.e("res",foundAddresses.toString());
} catch (IOException e) {
e.printStackTrace();
}
}
}, 0);
return true;
}
});
問題是,當我嘗試更改位置名稱時,總是有一種方法可以在搜索視圖欄位上產生較大的延遲。它運行不順利。例如在谷歌地圖中。我嘗試使用,AynchTask但結果比使用Handler.
有沒有辦法針對性能問題優化我的代碼?現在它看起來太丑了,因為當輸入一個字符時,在該字符出現在搜索視圖欄位之前總是有 2 秒的延遲。
uj5u.com熱心網友回復:
我可以看到一個大問題 - 您的代碼并沒有真正取消任何 API 呼叫。假設用戶輸入“the”。假設他每秒鍵入 5 個鍵。所以在時間 t=0,他輸入 t。在 t=5ms 左右,您的 onQueryTextChange 將被呼叫。在時間 t=6ms 左右,您的 onPostDelayed 將運行并進行 API 呼叫。
現在 h 出現在 = 200 毫秒。在 2=205 毫秒時,您取消所有訊息。問題是訊息已經運行。所以你什么都不取消。這意味著如果他以每秒 5 個鍵的速度鍵入,則您每秒進行 5 個 api 呼叫。
后期延遲的延遲應該足夠大,以便它檢測到打字的實際??延遲,而不是按字符觸發。否則你只會有大量的 API 呼叫。更糟糕的是,如果出于某種原因 API 呼叫 2 在 API 呼叫 1 之前回傳,您就會面臨競爭條件。對于延遲的好數字,我會使用打字訓練器并查看您的 wpm 是多少,并用它來找出合理的延遲可能是角色平均時間的 2 倍。這是一個很好的第一關。
此外,谷歌地圖在本地快取了大量資料。他們不太可能將所有字符逐個匹配地運行回服務器。至少他們會使用快取的本地資料來獲得快速結果,并使用網路來獲得更詳細的結果。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/358405.html
上一篇:哪個查詢消耗更少的資源更新或選擇
下一篇:避免回圈中的條件陳述句
