2011-10-26 46 views
0

我的應用程序中出現多線程問題。我知道Threads/AsyncTasks/etc中有很多帖子,但似乎沒有解決我的具體問題。在初始化ListView之前在單獨的線程中下載數據

基本上,我在我的搜索Activity中得到一個查詢字符串,然後將它發送給我的結果Activity,其中字符串用作SQL查詢,結果作爲JSON對象數組返回,然後顯示這些對象在ListView中(它是結果Activity的一部分)。我所有的SQL連接和檢索都是在結果Activity開始時調用的一個單獨的類中完成的。

MySQLRetrieve data = new MySQLRetrieve(); 
ArrayList<Tile> tiles = data.getResults(nameValuePairs, isLocationSearch); 

上面的代碼是我如何獲得SQL響應並將其轉換爲ArrayList,然後使用填充我的ListView。 getResults()負責所有這些。

我已經有單獨的線程工作下載圖像到ListView,但我無法工作得到SQL查詢和結果運行在它自己的線程。我想要達到的是:

  1. 用戶在搜索活動中輸入搜索查詢。
  2. 意圖被髮送到結果活動,並立即開始。
  3. ProgressDialog(只是動畫的微調器的東西,而不是加載欄)在SQL查詢發生時顯示。
  4. ListView用來自JSON數組的對象填充,延遲加載圖像。

我有步驟1,2和4運行良好,但3是問題。我查了一下AsyncTasks,這似乎是答案,但我無法讓他們工作。有沒有人有解決這個問題?我需要這樣做,因此在開始結果Activity時,UI會立即更改爲結果Activity,並且不必等到返回SQL響應爲止。

是的,我已經閱讀了無痛線程的帖子。

謝謝。

+0

你是什麼意思「......似乎沒有工作」? – DeeV

+0

我的ListView不會隨下載結果更新。 – jmhend

回答

2

我建議針對創建ArrayList<Tile>以減少內存消耗(和代碼大小)和而不是直接使用一個CursorAdapter SQLite的Cursor綁定到ListView

僅此一項可能會提高性能,足以讓您無需執行任何異步加載。

如果你仍然想異步加載,檢查出LoaderManager framework(可由於Android 3.0/API級別11,與Android support package下降到1.6/4),將自動地做你的Cursor的異步加載 - 或者使用內置的CursorLoader(如果您碰巧擁有ContentProvider),或者SO專家用戶創建的SimpleCursorLoader(如果您沒有)。

+0

對不起,我沒有說清楚。我沒有使用SQLite,我正在使用一個PHP腳本的MySQL服務器。 – jmhend

+0

沒問題,那麼無論如何我會推薦一個本地數據庫用於性能/緩存的原因。使用'AsyncTask'從PHP腳本下載JSON格式的數據,並將其放入應用程序的SQLite數據庫中。然後使用上面提到的'CursorAdapter'或'LoaderManager'方法從SQLite數據庫到'ListView'。這也將您的應用從服務器端分離出來,並允許您更新任一端而不會在另一端破壞事物。 –

相關問題