我正在使用異步任務從服務器填充自動完成建議。在自動完成中使用AsyncTask的最佳實踐?
問題: 當用戶輸入並刪除的EditText這麼多次的文字。 可以說他打了很多次:cofee> cof> coffee> coffee late ....等等。 爲每個文本後3關鍵字(閾值)更改我初始化一個asynctask並要求結果。 所以在當前的情況下,我有這麼多的線程在後臺運行。所以我最近的一些異步線程正在等待這個機會。 整個這使我的應用程序非常緩慢。
我能做些什麼來解決這個問題?
我正在使用異步任務從服務器填充自動完成建議。在自動完成中使用AsyncTask的最佳實踐?
問題: 當用戶輸入並刪除的EditText這麼多次的文字。 可以說他打了很多次:cofee> cof> coffee> coffee late ....等等。 爲每個文本後3關鍵字(閾值)更改我初始化一個asynctask並要求結果。 所以在當前的情況下,我有這麼多的線程在後臺運行。所以我最近的一些異步線程正在等待這個機會。 整個這使我的應用程序非常緩慢。
我能做些什麼來解決這個問題?
如果可以在服務器開始時加載整個數據......那麼您可以避免重複調用asynctask並從服務器獲取數據。這將改善你的應用程序的性能。如果在列表視圖中顯示的數據是字符串,下面的鏈接展示瞭如何對其進行過濾:
http://www.androidhive.info/2012/09/android-adding-search-functionality-to-listview/
如果自定義對象中的ListView適配器一起使用,請嘗試:
Filtering ListView with custom (object) adapter
希望這有助於。
數據非常大且動態。不能在第一時間加載。 –
您應該在發佈新任務之前取消當前任務。爲此使用AsyncTask#cancel(true)
,並確保可以快速停止任務的執行。這意味着正確處理中斷並經常檢查任務是否在AsyncTask#doInBackground
的主體中被取消。
而且你不能再次執行你已經取消的AsyncTask。你必須創建一個新的。 (試圖再次執行會導致IllegalStateExceptions)
您應該在每次用戶輸入三次之後啓動一個1秒或2秒的計時器。然後啓動異步任務 – Avijit
但這會停止最新的線程執行,甚至 –
我試圖取消當前的任務,並再次執行,它給了我: java.lang.IllegalStateException:無法執行任務:任務已在運行。 –