2012-01-25 54 views
1

我的活動是下載並顯示公告(來自公告web服務)。爲了保持UI響應我下面在後臺線程操作:Android:使用多線程使UI響應(實現平滑滾動)

1)上傳XML(數據存儲在XML),

2)處理XML,

3)上傳圖片。

再說,我更改用戶界面和後臺線程的優先級,以保持UI線程響應:

在主線程

Thread.currentThread().setPriority(10); 

在後臺線程:

Thread.currentThread().setPriority(1); 

每個公告被放在到TableRow中,並且每個TableRow都使用處理程序放在TableView中。 當用戶滾動TableView並即將到達表的末尾時,會添加新行併發送下一個通告的HTTP-GET(+ parcing(使用XPath)+圖像上傳+填充帶有內容的錶行)。

我的問題:

上傳和解析是在過程的用戶界面時

是隻有部分反應(有一些滯後0.1-0.5sec每當用戶滾動TableView中)。

我想做絕對平滑的滾動不依賴於數據上傳/處理。

以錯誤的方式做了什麼,還有什麼可以在這裏完成? 例如,如果我減少處理程序中的操作次數,它應該會提高響應能力......也許就是這樣。但是,我看不到那裏耗費大量資源的指令。


UPDATE

我使用的ListView來代替TableLayout改寫了我的代碼,因爲前者是相當快的(事實證明,我不知道)。但是,當XML處理和ListView滾動同時進行時,我仍然會出現尖峯。我做了2個實驗:

1)我刪除了所有後臺進程 - 向下滾動時向ListView添加了新行,但沒有爲這些行處理數據(所以它們保持爲空) - 此類變體工作良好,沒有任何秒殺,UI絕對響應。

2)第二個實驗是移除對ListView更新的調用(XML文件已處理,但發現的數據未傳遞給ListView適配器) - 那次我有尖峯。所以我得出結論這些尖峯是由於後臺線程,並不是由於UI更新調用。 如果讓我們的應用程序的優先級低於主應用程序的優先級,後臺線程如何減慢我的應用程序?

Thread.currentThread().setPriority(some_int); 

設置線程的優先級以正確的方式?

+0

剖析你的代碼,看看究竟是什麼導致了滯後。看看:http://developer.android.com/guide/developing/debugging/debugging-tracing.html – Ash

回答

0

在某些時候,UI線程需要添加這些新對象,在內存中創建新的UI對象,並將它們添加到繪圖列表中。 您可以嘗試的是通過在UI中製作大量不可見的錶行來預先分配儘可能多的內存。這可能會解決一些問題,因爲潛在的UI線程正試圖重新分配內存以爲新的TableRows騰出空間。

此外,您可以嘗試在後臺線程中使用Thread.yield()。這通知android操作系統該線程已準備就緒,並且如果需要的話允許UI線程的恢復(如果UI線程空閒,它將立即恢復)。

-1

如果你沒有在你的UI線程上做任何I/O,那麼你描述的滯後可能是佈局傳遞。建議您專注於優化佈局。有什麼理由不使用ListView嗎?