2013-11-26 24 views
2

我正在使用異步任務從服務器填充自動完成建議。在自動完成中使用AsyncTask的最佳實踐?

問題: 當用戶輸入並刪除的EditText這麼多次的文字。 可以說他打了很多次:cofee> cof> coffee> coffee late ....等等。 爲每個文本後3關鍵字(閾值)更改我初始化一個asynctask並要求結果。 所以在當前的情況下,我有這麼多的線程在後臺運行。所以我最近的一些異步線程正在等待這個機會。 整個這使我的應用程序非常緩慢。

我能做些什麼來解決這個問題?

+0

您應該在每次用戶輸入三次之後啓動一個1秒或2秒的計時器。然後啓動異步任務 – Avijit

+0

但這會停止最新的線程執行,甚至 –

+0

我試圖取消當前的任務,並再次執行,它給了我: java.lang.IllegalStateException:無法執行任務:任務已在運行。 –

回答

1

如果可以在服務器開始時加載整個數據......那麼您可以避免重複調用asynctask並從服務器獲取數據。這將改善你的應用程序的性能。如果在列表視圖中顯示的數據是字符串,下面的鏈接展示瞭如何對其進行過濾:

http://www.androidhive.info/2012/09/android-adding-search-functionality-to-listview/

如果自定義對象中的ListView適配器一起使用,請嘗試:

Filtering ListView with custom (object) adapter

希望這有助於。

+0

數據非常大且動態。不能在第一時間加載。 –

0

您應該在發佈新任務之前取消當前任務。爲此使用AsyncTask#cancel(true),並確保可以快速停止任務的執行。這意味着正確處理中斷並經常檢查任務是否在AsyncTask#doInBackground的主體中被取消。

而且你不能再次執行你已經取消的AsyncTask。你必須創建一個新的。 (試圖再次執行會導致IllegalStateExceptions)