Bitmap调用recycle? When?
Bitmap有一个recycle方法,意思很简单,回收Bitmap的空间。
Q 1: Bitmap是否有调用recycle方法的必要性?
A: 嵌入式系统总是格外注重空间的问题,不小心的话就会有OOM。但是应用层使用java的android平台有其天然的优势【java语言有自己的垃圾回收,android平台上各个application有自己的process自己的空间】。
无需调用bitmap的理由有:
a. 垃圾回收会处理的;
b. 当application关闭,process被杀掉,所有这个process占用的空间自然回归系统;
但是,如果你有点洁癖,或者有点理想主义,或者很有控制欲,或者很闲。。。bitmap的recycle函数的调用还是可以是有必要的,理由有:
a. 垃圾回收虽然好使,但是有可能的话,我们还是让它少干点活吧。垃圾回收有很大的未来不确定性,会加重未来未知时间点的loading,若有大量bitmap需要垃圾回收处理,那必然垃圾回收需要做的次数就更多也发生地更频繁,小心会造成ANR。但是,若是自己recycle,就可以可控制地分散处理了这些回收任务了。
b. 若是launcher那样一直运行的application,它的process一直存在,memory问题还是多多注意下比较好。
Q2: When?
A: Timing的问题在这里很重要。早了就大事不好了,会有这样的Exception:
java.lang.RuntimeException,Canvas: trying to use a recycled bitmap
android.graphics.Bitmap@44ebeee0,Canvas.java,955
So, 怎样才可以保证不会早了呢?
关于图片显示,重要的时间点:
step1: 设置进去的时间点;
Step2: 画面画出来的时间点;
最保险最笨的做法,在新的图片设置进去以后再recycle掉老的图片,这样做的坏处在于,在某个时间段,你需要的空间是double的【新旧两套都在】;
如果你不偏向于那么做,又有时间,可以考虑后面一个时间点,除了setImage以及其它代码中显示调用那个bitmap的时候我们会检查bitmap,在acticvity变为visible的时候系统还是会去找之前设置进去的bitmap【即使你的onResume方法里面并没有提到去refresh UI,这件事情它也是会去做的,大概不然它就不知道这次该显示些什么了】。所以,在UI线程里面,在一个不可能被打断的方法里面,是先设置新的bitmap还是先recycle旧的图片是没有影响的。
譬如说 mBitmap.recycle();
mBitmap = ..... //设置
mImageView.setImage(mBitmap);
这样的代码是完全可以的。
后面这样的做法,最重要的就是确保:在UI线程【因为设置UI显示只能在UI主线程里】里面一个不可能被打断的方法里面。这个是为了确保在两者之间UI主线程不可能被打断,不可能刚好从invisible变成visible。
所以,特别小心两种东西:
1. 多线程【个人觉得最好不要在其他线程里面调用UI用过的bitmap的recycle方法,多线程之间是很难保证时间顺序的,暂时没有想出一种在background thread里面recycle的合理的方式】;
2. 非及时发生的方法:譬如,发intent啊,发notify啊去通知UI主线程去做UI重新刷新并不能替代mImageView.setImage(mBitmap);这样的句子。完全有可能,你确实发了intent出去了,但是目标activity之一还没有做UI重新设置【Q: maybe没收到 or 收到但还是等待处理,不确定这两种可能是不是都有可能】,这个时候这个acitivity变成visible了,系统仍然试图找旧的图片,找不到了就会报exception了。
PS: java.lang.RuntimeException,Canvas: trying to use a recycled bitmap android.graphics.Bitmap@44ebeee0,Canvas.java,955 这样的exception可能也许你并不能够看到,默认的log里面好像只能看到uncaught exception,第一次看到是在monkey的events.log里面,若你知道怎么打开相应手机这方面的log trace应该也是可以看到的。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/Lavernock/archive/2010/10/26/5966517.aspx
分享到:
相关推荐
Android 双缓存机制下 Bitmap Recycle方案 双缓存机制下,Android应用会对大内存的图片做二级缓存,对于溢出缓存的bitmap实行recycle,但是有些bitmap正在显示,会造成概率性的花屏等, 该方案提供了一套完整的防止...
"Recycle Bitmap In Layout" 是一个针对这一问题的解决方案,它提供了一个工具类来帮助开发者回收布局中ImageView所占用的Bitmap资源,以防止内存泄漏并优化应用的内存使用。 在Android系统中,Bitmap对象是非常...
需要注意的是,创建新的Bitmap并不会改变原始Bitmap的内容,原始Bitmap仍然存在并占用内存,因此在不再需要时,记得调用`bitmap.recycle()`释放资源,避免内存泄漏。 除了基本的切割操作,我们还可以结合Canvas进行...
bitmap.recycle(); ``` 这个"Bitmap位图旋转范例"工程可能还包含了优化旋转性能的策略,比如使用`BitmapShader`进行位图的内存优化,或者在特定情况下使用`BitmapRegionDecoder`来解码部分图像,避免一次性加载大图...
- 记得在不再使用Bitmap和Drawable时调用`recycle()`和`setCallback(null)`释放资源。 以上就是关于Android中Drawable和Bitmap相互转换的方法、注意事项以及应用场景的详细解释。理解并熟练运用这些知识,能够帮助...
System.out.println("=============recycle bitmap======="); } } cache.clear(); } ``` 上述代码展示了如何在需要的时候释放缓存中的`Bitmap`对象。 ### 4. 动态调整图片大小 在加载图片之前先获取其原始...
使用`bitmap.recycle()`方法回收,但要注意回收后不能再使用。 三、Bitmap的使用技巧 1. **避免在循环中创建Bitmap**:这会导致内存快速增加,容易引发OOM。尽可能在循环外创建并重用Bitmap。 2. **使用Pool**:...
- **Recycle**:不再使用的Bitmap要调用`recycle()`方法释放内存,但注意回收后不能再次使用。 7. **内存管理** - **了解内存层次**:Dalvik堆、Ashmem、Ashmem mapped file等内存区域对Bitmap的影响。 - **避免...
因此,开发者通常需要在不使用Bitmap时及时释放,可以通过调用`recycle()`方法进行回收。此外,Android提供了BitmapFactory类,该类提供了许多优化解码的方法,如`decodeResource()`、`decodeFile()`和`decodeStream...
使用完Bitmap后记得调用`recycle()`,但需要注意,回收的Bitmap不能再使用。此外,使用弱引用或软引用可以防止Bitmap成为内存泄漏的源头。 8. **文件I/O操作**:如果从文件系统读取24位深度的Bitmap,需要使用高效...
当Bitmap不再使用时,应及时调用`recycle()`方法释放GPU内存,但需要注意,一旦回收,不能再使用该Bitmap。而在API 19及以上版本,可以使用`BitmapPool`和`Pooling`策略来更有效地管理Bitmap内存。 总的来说,...
- **释放引用**:及时调用`bitmap.recycle()`来回收Bitmap,但要注意只有当Bitmap不再被任何地方引用时才能回收,否则会导致空指针异常。 - **系统回收**:如果Bitmap在内存缓存中,系统在内存紧张时会自动回收。...
使用`bitmap.recycle()`方法可以回收Bitmap的内存,但需要注意回收后不能再使用该Bitmap。此外,当Bitmap所在的Activity被销毁时,系统会自动回收,一般无需手动处理。 **五、Bitmap的性能优化** 1. **异步加载**:...
2. 使用Bitmap.recycle():当位图不再使用时,调用recycle()释放其占用的内存,但要注意回收后不能再使用该位图。 3. 使用软引用或弱引用:通过SoftReference或WeakReference持有Bitmap对象,帮助垃圾回收器更好地...
此外,使用`recycle()`方法可以释放Bitmap占用的像素数据,但要注意这并不释放关联的Native内存,因此最好配合`System.gc()`或` WeakReference`使用。 7. **Bitmap配置与颜色模型** 在创建Bitmap时,可以选择不同...
在不再使用Bitmap时,应调用`recycle()`方法释放其占用的内存。但需要注意,一旦回收,Bitmap将不能再次使用。在现代Android版本中,系统会自动管理,但手动回收仍有助于防止内存泄漏。 9. 处理大图 大图处理是...
- 及时回收:使用recycle()方法回收Bitmap占用的内存,并调用System.gc()辅助尽快进行垃圾回收。 - 压缩图片:在将Bitmap保存到存储前,先进行压缩,减少存储消耗。 2. Bitmap.recycle()方法什么时候会回收内存?...
8. **及时释放Bitmap**:不再使用Bitmap时,调用`recycle()`方法释放其占用的内存。但要注意,一旦回收,不能再使用该Bitmap,否则可能出现不可预知的问题。 9. **使用 Glide 或 Picasso 图片加载库**:这些第三方...
不使用的Bitmap应及时释放,使用`recycle()`方法回收内存,但注意回收后不能再次使用。 - Android 3.0及以上版本引入了Bitmap池,通过配置`Bitmap.Config`类型和` BitmapFactory.Options`来优化内存使用。 4. **...
- 使用完Bitmap后,应调用`recycle()`释放资源,但需注意避免跨线程访问。 - 使用`System.gc()`或` WeakReference<Bitmap>`可以帮助管理Bitmap内存。 7. **硬件加速** - 开启硬件加速:在AndroidManifest.xml中...