-3

カスタムリストアダプターを使用して、サイドリストにテキストと画像を持つリストビューを作成します。うまく機能しますが、リストビューを繰り返し上にスクロールすると、アプリケーションがクラッシュし、ログキャットにヒープサイズの問題が表示されます。

この問題を解決するにはどうすればよいですか? HTC one V(4.0 API) でアプリケーションをテストしたとき、Low Api バージョンでは問題は発生しませんでしたが、スクロール時にのみクラッシュし、スクロールは 3 回または 4 回動作しますが、スクロールをさらに実行すると、ハングして強制終了しましたヒープサイズの問題。

スタックトレース:

I/dalvikvm(20978):   at dalvik.system.NativeStart.main(Native Method)
09-03 07:58:33.796: E/dalvikvm(20978): Out of memory: Heap Size=131107KB, Allocated=130843KB, Limit=49152KB
09-03 07:58:33.796: E/dalvikvm(20978): Extra info: Footprint=131043KB, Allowed Footprint=131107KB, Trimmed=1096KB
09-03 07:58:33.796: D/skia(20978): --- decoder->decode returned false
09-03 07:58:33.796: D/AndroidRuntime(20978): Shutting down VM
09-03 07:58:33.796: W/dalvikvm(20978): threadid=1: thread exiting with uncaught exception (group=0x40ab8228)
09-03 07:58:33.826: E/AndroidRuntime(20978): FATAL EXCEPTION: main
09-03 07:58:33.826: E/AndroidRuntime(20978): java.lang.OutOfMemoryError: (Heap Size=131107KB, Allocated=130843KB)
09-03 07:58:33.826: E/AndroidRuntime(20978):  at android.graphics.BitmapFactory.nativeDecodeFile(Native Method)
09-03 07:58:33.826: E/AndroidRuntime(20978):  at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:373)
09-03 07:58:33.826: E/AndroidRuntime(20978):  at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:443)
09-03 07:58:33.826: E/AndroidRuntime(20978):  at com.raila.controller.ImageDownloader.download(ImageDownloader.java:90)
09-03 07:58:33.826: E/AndroidRuntime(20978):  at com.raila.view.NewsActivity$ItemsAdapter.getView(NewsActivity.java:166)
09-03 07:58:33.826: E/AndroidRuntime(20978):  at android.widget.AbsListView.obtainView(AbsListView.java:2054)
09-03 07:58:33.826: E/AndroidRuntime(20978):  at android.widget.ListView.makeAndAddView(ListView.java:2004)
09-03 07:58:33.826: E/AndroidRuntime(20978):  at android.widget.ListView.fillUp(ListView.java:889)
09-03 07:58:33.826: E/AndroidRuntime(20978):  at android.widget.ListView.fillGap(ListView.java:829)
09-03 07:58:33.826: E/AndroidRuntime(20978):  at android.widget.AbsListView.trackMotionScroll(AbsListView.java:4636)
09-03 07:58:33.826: E/AndroidRuntime(20978):  at android.widget.AbsListView$FlingRunnable.run(AbsListView.java:3899)
09-03 07:58:33.826: E/AndroidRuntime(20978):  at android.os.Handler.handleCallback(Handler.java:607)
09-03 07:58:33.826: E/AndroidRuntime(20978):  at android.os.Handler.dispatchMessage(Handler.java:92)
09-03 07:58:33.826: E/AndroidRuntime(20978):  at android.os.Looper.loop(Looper.java:154)
09-03 07:58:33.826: E/AndroidRuntime(20978):  at android.app.ActivityThread.main(ActivityThread.java:4974)
09-03 07:58:33.826: E/AndroidRuntime(20978):  at java.lang.reflect.Method.invokeNative(Native Method)
09-03 07:58:33.826: E/AndroidRuntime(20978):  at java.lang.reflect.Method.invoke(Method.java:511)
09-03 07:58:33.826: E/AndroidRuntime(20978):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
-03 07:58:33.826: E/AndroidRuntime(20978):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
09-03 07:58:33.826: E/AndroidRuntime(20978):  at dalvik.system.NativeStart.main(Native Method)
09-03 07:58:33.977: I/dalvikvm-heap(20978): Clamp target GC heap from 134.749MB to 128.000MB
09-03 07:58:33.987: D/dalvikvm(20978): GC_CONCURRENT freed 388K, 1% free 130500K/131043K, paused 2ms+33ms
09-03 07:58:36.379: D/Process(20978): killProcess, pid=20978
4

2 に答える 2

1

listview (およびその他の adapterView) がどのように機能するかをよりよく理解するには、ビデオ「the world of listview 」をご覧ください。

チェックアウトするもう 1 つの良い点は、効率的な方法でビットマップを処理する方法です。

また、古いタスクが表示する「新しい」ビューの内容を変更しないように、getView 関数に到達するたびにビューホルダー タスクをキャンセルする必要があります。

于 2013-01-10T06:47:34.010 に答える
0

エラーは、ビットマップを使用している場合です。スクロールすると、新しいビットマップが次々とロードされるため、ある時点でメモリが不足します。ビットマップが表示されなくなったら、「recycle()」を呼び出す必要があります。これを正しく行う方法を示す投稿が Android Developer Blog にあります。http://developer.android.com/training/improving-layouts/smooth-scrolling.htmlhttp://developer.android.com/training/displaying-bitmaps/cache-bitmap.htmlを確認してください

于 2012-09-03T09:41:39.530 に答える