我在我的android应用程序中有一个网格视图。我从服务器加载图像到网格视图。我使用延迟加载。我必须回收在此处创建的所有位图。如何在Adapter或Grid视图中执行Bitmap.recycle()。我越来越内存,请帮助我。如何回收GridView适配器中的位图?
回答
您将需要显示一些代码(至少是您的适配器)。如果你的内存出错,你可能没有正确地实现视图回收,或者有其他内存泄漏。也有可能你只是一次加载太多的大型位图,但是如果你可以加载视图,那么它更有可能发生内存泄漏。
没有人能够在不查看某些代码的情况下追踪内存泄漏。 Bitmap.recycle()不是解决方案,如果代码的其余部分没有问题,垃圾收集器将无法正常工作。
请参阅:http://www.youtube.com/watch?v=_CruQY55HOk关于管理android中的内存以及发现内存泄漏的热门话题。
另请尝试:http://android-developers.blogspot.com/2010/07/multithreading-for-performance.html了解如何下载或以其他方式正确异步加载图像到视图列表中的示例。
编辑:还检查了图像加载库我写的,所以你不必担心任何这样的:https://github.com/bumptech/glide
退房的Displaying Bitmaps Efficiently Android的训练课。它有一个教训,Displaying Bitmaps in your UI,涵盖了使用后台线程以及内存和磁盘缓存在GridView中显示位图。
有工作得非常好一个非常简单的方法:
首先,你必须创建一个自定义的ImageView这样的:
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保持一个指向位图和回收旧在设置新的之前。
其次,您必须检查适配器的getView以查看convertView是否为null。如果它不是null投射到我们的自定义ImageViewRecyclable并在其上设置位图。这种方法在设置新的位图之前会回收旧的位图。
这是适配器的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的图像。在显示50张带有内存错误的图像后,原始ImageView失败,但此代码运行良好,直到网格结束。
此代码适用于小型离线图像,但在线和大型图像需要缓存和其他内容。这可能很有用,但必须应用一些更改。
- 1. 如何在GridView适配器中存储位图?
- 2. 回收适配器定位问题
- 3. 如何测试Android Studio中的回收站视图适配器
- 4. 如何在另一个回收视图适配器下回收视图适配器?
- 5. 如何从Firebase回收站适配器设置图片的值?
- 6. 使回收器视图适配器中的HashMap类型列表
- 7. android gridview头解决方案与适配器回收单元格
- 8. 在回收视图适配器中使用寻呼机适配器Android
- 9. android- OnClickListener不适用于回收适配器内的视图
- 10. GridView的自定义视图适配器
- 11. 没有图像适配器的Android Gridview
- 12. 适配器不填充回收器
- 13. 如何在回收站视图适配器中添加动态文本视图?
- 14. 在连接到适配器的图库中显示位图时,“无法绘制回收的位图”
- 15. 的Android回收站查看适配器
- 16. 如何回收AsyncTask中的位图? Android
- 17. 回收站电源适配器没有与更新适配器
- 18. 当回收商想要回收适配器时,会调用哪种回收站适配器方法
- 19. gridview适配器上的overridePendingTransition
- 20. Monodorid上的GridView适配器
- 21. 如何在移除物品时保持回收站适配器的位置?
- 22. Android Spannable不能在回收站视图适配器中工作
- 23. android - 回收适配器没有出现在视图页面中
- 24. 回收站适配器不叫onCreateViewHolder
- 25. 如何更新Firebase回收站适配器的查询引用?
- 26. 如何在回收视图适配器中使用getItematposition()作为ListView
- 27. 如何在回收器适配器中的onclicklistener中调用对话框片段
- 28. GridView中的自定义适配器
- 29. Android GridView适配器定制
- 30. Android GridView与适配器