私はアンドロイドのアプリでグリッドビューを持っています。私はサーバからグリッドビューにイメージをロードしています。遅延読み込みを使用しています。ここで作成されたすべてのビットマップをリサイクルする必要があります.AdapterまたはGridビューでBitmap.recycle()を実行する方法。私は記憶がなくなり、助けてください。グリッドビューアダプタでビットマップをリサイクルする方法は?
答えて
コードを表示する必要があります(アダプターは最低限必要です)。メモリエラーが発生している場合は、ビューのリサイクルを正しく実装していないか、メモリリークが発生している可能性があります。一度にたくさんの大きなビットマップをロードするだけでも可能ですが、ビューをロードすることができれば、メモリリークが発生する可能性が非常に高くなります。
誰かがコードを見ずにメモリリークを追跡することはできません。 Bitmap.recycle()は解決策ではありません。ガベージコレクタはコードの残りの部分が正常であれば十分に機能します。
参照:http://www.youtube.com/watch?v=_CruQY55HOkアンドロイドのメモリ管理とメモリリークの発見に関する素晴らしい話は、http://www.youtube.com/watch?v=_CruQY55HOkをご覧ください。
http://android-developers.blogspot.com/2010/07/multithreading-for-performance.htmlまた、画像をビューのようなリストにダウンロードしたり正しく非同期に読み込んだりする方法の例については、試してみてください。
編集:また、私が書いたイメージロードライブラリをチェックアウトするので、あなたは、このいずれかを心配する必要はありません。https://github.com/bumptech/glide
Displaying Bitmaps Efficiently Androidのトレーニングクラスをご覧ください。バックグラウンドスレッドとメモリとディスクキャッシュを使用してGridViewにビットマップを表示することをカバーするレッスンDisplaying Bitmaps in your UIを持っています。非常にうまく機能本当に簡単な方法はあり
:ビットマップへのポインタを維持し、古いものをリサイクル
public class ImageViewRecyclable extends ImageView
{
private Bitmap bitmap;
public ImageViewRecyclable(Context context)
{
super(context);
}
@Override
public void setImageBitmap(Bitmap bm)
{
super.setImageBitmap(bm);
if (bitmap != null) bitmap.recycle();
this.bitmap = bm;
}
}
当社ImageViewRecyclable:
まず、あなたは、このようなカスタムImageViewのを作成する必要があります新しいものを設定する前に。
第2に、convertViewがnullかどうかを確認するには、アダプタのgetViewをチェックインする必要があります。カスタムのImageViewRecyclableにnullがキャストされていない場合は、その上にビットマップを設定します。この方法で古いビットマップをリサイクルしてから新しいビットマップを設定します。
これは、アダプタのgetViewメソッドのコードです:
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
ImageViewRecyclable imageView = (convertView == null) ? new ImageViewRecyclable(ActivityMain.this) : (ImageViewRecyclable) convertView;
byte[] bytes = ....
Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
imageView.setImageBitmap(bitmap);
return imageView;
}
私が1000枚の100x100の画像でこのコードをテストしました。元のImageViewはメモリエラーで50のイメージを表示した後に失敗しましたが、このコードはグリッドの最後までうまく動作します。
このコードは、小さなオフライン画像では非常に効果的ですが、オンラインや大きな画像にはキャッシングなどが必要です。これは便利ですが、いくつかの変更を適用する必要があります。
- 1. ANDROID:ヘルプ、outofmemoryビットマップが予算サイズを超えています。リサイクル方法は?
- 2. AndroidビューのSimpleCursorAdapterで、ギャラリービューでビットマップをリサイクルすることはできますか?
- 3. actionscript3:ビットマップをスムーズにする方法は?
- 4. Android:ビットマップをシフトする方法は?
- 5. Crystal Reportsデータセットをリサイクルする方法はありますか?
- 6. ビットマップをプログラムで作成する方法
- 7. relativelayout.setBackgroundDrawable()をビットマップで使用する方法?
- 8. ビットマップを線で分割する方法
- 9. リサイクル()、リサイクル()
- 10. SqlDataSourceオブジェクトのデータをリサイクルする方法は?
- 11. ListAdaptersでリサイクルされたアイテムの問題を回避する方法は?
- 12. ビットマップをメモリに保持する方法
- 13. スクリーンメモリのビットマップをスクロールする方法
- 14. キャンバスをビットマップにコピーする方法
- 15. ビットマップにアルファチャンネルを追加する方法
- 16. ビットマップをアンドロイドギャラリーに保存する方法
- 17. ビットマップをHashMapに挿入する方法
- 18. androidの圧縮方法を使わないでビットマップにビットマップを変換する
- 19. ネットワーク共有からファイル/フォルダをリサイクルする方法
- 20. キャンバス内でビットマップの位置を取得する方法は?
- 21. RGB_565でビットマップを作成する方法は?
- 22. キャンバス内のビットマップでontouchイベントを取得する方法は?
- 23. Androidでビットマップを保存および表示する方法は?
- 24. SurfaceViewでビットマップをタッチ位置に移動する方法は?
- 25. onDraw()サーフェスビューでビットマップをアニメートする方法は?
- 26. キャンバス:リサイクルされたビットマップを使用しようとしています。
- 27. 他のビットマップからビットマップを切り取る方法
- 28. InnoDBでauto_increment IDをリサイクルしない方法
- 29. onMeasureの後にカスタムサーフェイスビューでビットマップを割り当てる方法は?
- 30. uitableviewcellのようなカスタム要素を再利用/リサイクルする方法は?