2011-10-19 34 views
2

我有Android listview使用SimpleCursorAdapter適配器和快速滾動列表視圖啓用。如果我有較小的數據集快速滾動做工精細,但對於大型數據集(超過4000條記錄),同時快速滾動通過ANR列表視圖就會在 一個* ndroid.os.BinderProxy.transact(本機方法)ANR快速滾動listview與更大的數據集

在安卓.database.BulkCursorProxy.getWindow(BulkCursorNative.java:215) 在android.database.BulkCursorToCursorAdaptor.onMove(BulkCursorToCursorAdaptor.java:104) 在android.database.AbstractCursor.moveToPosition(AbstractCursor.java:188) 在android.database .CursorWrapper.moveToPosition(CursorWrapper.java:187) at android.widget.AlphabetIndexer.getPositionForSection(AlphabetIndexer.java:202)*

以及logcat show * 10-19 11:40:20.664 3026 3215 D光標:skip_rows第41行 10-19 11:40:20.773 3026 3215 E CursorWindow:需要增長:mSize = 1048576,size = 55,freeSpace ()= 42,numRows = 2471 10-19 11:40:20.773 3026 3215 E CursorWindow:沒有增長,因爲已經有2471行,最大大小1048576 10-19 11:40:20.773 3026 3215 E遊標:40::20.796 3026 3215 d光標:在失敗2511,14 11月10日至19日分配用於文本/斑點55個字節finish_program_and_get_row_count行1614 *

我認爲光標解除分配和用於更大的數據集分配內存。這導致ANR

讓我知道,如果你有什麼好的解決辦法來克服這個問題,並在此先感謝

問候, Sathish所在

回答

0

嗯,我有遇到過類似issue.My給你的建議會創建一個自定義的ArrayAdapter,而不是使用CursorAdapter。當屏幕顯示時,從數據庫中獲取後端線程中的記錄(直到此時向用戶顯示進度條),將它們填充到自定義Arrayadapter中並顯示它獲取所有記錄需要一定的時間,但Android數據庫相對較慢,您不能爲此做很多事情。一旦記憶中的所有數據庫對象,您的快速滾動將非常快速,因爲所有內容都將存儲在內存中。我已用30,000條記錄對此進行了測試。

-----優化你的邏輯,以節省內存.------

而不是fecthing對所有項目組的完整記錄,只取了最初的所有項目的主鍵,並把它傳遞給您的自定義ArrayAdapter。重寫getViews方法,並在那裏獲取該特定id的記錄。您可以清空不可見的項目。通過這種方式,只有可見的6到8項記錄將存儲在內存中。 讓我知道你是否有進一步的問題來實現這一點。