我在我的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. 回收适配器定位问题
- 2. 如何测试Android Studio中的回收站视图适配器
- 3. 如何在另一个回收视图适配器下回收视图适配器?
- 4. 如何从Firebase回收站适配器设置图片的值?
- 5. 在回收视图适配器中使用寻呼机适配器Android
- 6. android- OnClickListener不适用于回收适配器内的视图
- 7. 没有图像适配器的Android Gridview
- 8. 适配器不填充回收器
- 9. 如何在回收站视图适配器中添加动态文本视图?
- 10. 的Android回收站查看适配器
- 11. 回收站电源适配器没有与更新适配器
- 12. 当回收商想要回收适配器时,会调用哪种回收站适配器方法
- 13. gridview适配器上的overridePendingTransition
- 14. 如何在移除物品时保持回收站适配器的位置?
- 15. Android Spannable不能在回收站视图适配器中工作
- 16. 回收站适配器不叫onCreateViewHolder
- 17. 如何在回收视图适配器中使用getItematposition()作为ListView
- 18. 如何更新Firebase回收站适配器的查询引用?
- 19. GridView中的自定义适配器
- 20. android:如何使回收站视图和适配器之间的接口clss
- 21. 如何共享具有两个回收站视图的适配器项目?
- 22. Gridview滚动 - 回收视图
- 23. 如何从GridView的适配器中获取每个EditText的值?
- 24. 根据回收站适配器中的位置在ImgeView上设置Alfa
- 25. 我正在使用融合的位置API来查找回收视图适配器中的当前位置,适配器正在使用的片段类
- 26. 资产的位图列表适配器
- 27. 如何膨胀GridView适配器中的布局
- 28. 从回收站视图适配器访问片段变量
- 29. 如何显示对话框片段从ImageView onClick在回收视图适配器
- 30. 如何通过dataBinding(google)为回收站视图制作适配器?