2011-10-19 8 views
2

SimpleCursorAdapterアダプタを使用してアンドロイドリストビューを使用し、リストビューに対してファストスクロールが有効になっています。私は小さいデータセットを持っている場合、高速スクロールは正常に動作しますが、大きなデータセット(4000レコード以上)の場合、リストビューを高速にスクロールしながら、ANRを経由して表示されます。 android.databaseでandroid.database.AbstractCursor.moveToPosition(AbstractCursor.java:188) でandroid.database.BulkCursorToCursorAdaptor.onMove(BulkCursorToCursorAdaptor.java:104) で.database.BulkCursorProxy.getWindow(BulkCursorNative.java:215) .CursorWrapper.moveToPosition(CursorWrapper.java:187)android.widget.AlphabetIndexer.getPositionForSection(AlphabetIndexer.java:202)の *ANRより大きいデータセットでリストビューを高速でスクロールする

またlogcatの表示 * 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カーソル:finish_program_and_get_row_count行1614 *

Iカーソルが大きいデータセットのためのメモリの割り当てを解除し、割り当てて考える2511,14 10-19 11でテキスト/ブロブ55のバイトを割り当てることに失敗しました。 ANR

にこのリードは事前に私はあなたに似たissue.My提案に直面していた

よろしく、 サティッシュまあ

答えて

0

を、この問題と感謝を克服するために何か良い解決策を持っているなら、私を知ってみましょうCursorAdapterを使用せずにカスタムArrayAdapterを作成することができます。画面を表示するには、データベースからバックエンドスレッドのレコードをフェッチし(カスタムバーにユーザの進捗バーを表示してカスタムArrayAdapterに入力して表示します)すべてのレコードを取得するには時間がかかりますが、Androidデータベースは比較的遅く、メモリ内のすべてのデータベースオブジェクトにはあまり役に立ちません。高速スクロールはすべてがメモリに格納されるので非常に高速になります。これを30,000レコードでテストしました。

-----メモリを節約するために、あなたのロジックを最適化.------

代わりに、すべての項目の完全なレコードセットをfecthingの、唯一の最初にすべての項目の主キーを取得し、それを渡しますカスタムArrayAdapter getViewsメソッドをオーバーライドし、その特定のIDのレコードを取得します。可視ではない項目をヌルにすることができます。この方法では、表示可能な6〜8個の項目レコードだけがメモリに格納されます。 これを実装する際にさらに問い合わせがある場合はお知らせください。