Android-视图显示大量图片时的内存问题

昨天优化一个项目(基本上每个ACTIVITY都会有大量图片),查了很多资料,借鉴了一些做法,网上的说法有对有错,这里总结一下。
android3.0默认heap size为48m,进入ddms,在ddms中“update heap”-“cause gc”,查看应用的内存使用情况,发现每进入一个activity,1-byte array(byte[], boolean[])的值总是会相应的增加,到最后一个activity的时候啥都不干,heap
size已经快30m了。通过分析,1-byte array就是bitmap的占用空间,这就说明不断有新的bitmap在内存中。由于ui使用了很多图片,比如大背景图,按钮图片等等,看来是这些图片 都会存在内存中,即使当前activity已经销毁进入下一个activity,前一个activity的图片资源也没有销毁。
其中一个做法是:
用Bitmap bm = BitmapFactory.decodeResource(this.getResources(), R.drawable.splash);
BitmapDrawable bd = new BitmapDrawable(this.getResources(), bm);
mBtn.setBackgroundDrawable(bd);
来代替mBtn.setBackgroundResource(R.drawable.splash)。
销毁的时候使用:
BitmapDrawable bd = (BitmapDrawable)mBtn.getBackground();
mBtn.setBackgroundResource(0);//别忘了把背景设为null,避免onDraw刷新背景时候出现used a recycled bitmap错误
bd.setCallback(null);
bd.getBitmap().recycle();
因为setBackgroundResource时,会缓存图片的CHCHE,以便重绘时加快速度。如果说,每次都使用recycle的话,就达不到这个目的了。而且根据以往的经验,对于一般应用,根本就没有这个必要,内存过大,势必还有原因造成。
在“update heap”-“cause gc”,点击1-byte array(byte[], boolean[])行后,在Heap表里,查看图片内存的占用比例直方图,发现一些图片的占用内存居然高达10M(特别是在三星galaxy note运行时),但项目里最大的原始图片也才1M多,很明显程序的写法有问题。最后,发现,在资源文件里,设置android:background为某些图片时,导致内存大增。但如果把设置背景的步骤写在JAVA代码里,问题便解决了。
JAVA代码:
testview.setBackgroundResource(R.drawable.testview_bg);//内存还是会增大两三倍
结合上面的另一种作法,改用setBackgroundDrawable,如:
Bitmap bitmap = null;
            try {
                bitmap = BitmapFactory.decodeResource(context.getResources(),
                        res, bfOptions);
            } catch (OutOfMemoryError oom) {
                android.util.Log.e("getSDCardImageBitmapByUrl",
                        "OutOfMemoryError");
                System.gc();
                System.runFinalization();
            } finally {

            }
            if (bitmap != null && !bitmap.isRecycled()) {
                BitmapDrawable bd = new BitmapDrawable(context.getResources(),
                        bitmap);
                v.setBackgroundDrawable(bd);
                // bitmapCache.put(key, new WeakReference<Bitmap>(bitmap));
                drawableCache.put(key, new WeakReference<Drawable>(bd));
            }
内存问题解决。
但是,setBackgroundResource和setBackgroundDrawable的差别为什么这么大,待研究。。。

时间: 2024-08-24 12:08:02

Android-视图显示大量图片时的内存问题的相关文章

android webview显示html片段时的相关问题

问题描述 android webview显示html片段时的相关问题 webview显示html片段时,在刚显示时总会先竖着显示,而且字特别小,然后才显示正常,怎样才能让不出现竖着的小字呢?有人遇到过这种情况吗? 解决方案 Android WebView显示HTML时右边有空白Android WebView显示HTML时右边有空白解决WebView加载离线HTML时白屏.黑屏以及可能不显示的问题 解决方案二: http://blog.csdn.net/lxk_1993/article/detai

[Android]异步加载图片,内存缓存,文件缓存,imageview显示图片时增加淡入淡出动画

以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/3574131.html  这个可以实现ImageView异步加载图片,内存缓存,文件缓存,imageview显示图片时增加淡入淡出动画. github地址:https://github.com/wangjiegulu/ImageLoaderSample 解决了: 1. listview加载oom问题 2. listview加载时卡顿的现象 3. listview

android友盟分享QQ和QQ空间时出现内存泄露

问题描述 android友盟分享QQ和QQ空间时出现内存泄露 05-12 19:22:46.570: E/StrictMode(30304): A resource was acquired at attached stack trace but never released. See java.io.Closeable for information on avoiding resource leaks. 05-12 19:22:46.570: E/StrictMode(30304): jav

Android实现歌曲播放时歌词同步显示

我们需要读取以上歌词文件的每一行转换成成一个个歌词实体: public class LyricObject { public int begintime; // 开始时间 public int endtime; // 结束时间 public int timeline; // 单句歌词用时 public String lrc; // 单句歌词 } 可根据当前播放器的播放进度与每句歌词的开始时间,得到当前屏幕中央高亮显示的那句歌词.在 UI线程中另起线程,通过回调函数 onDraw() 每隔100m

android真机调试时无法显示logcat信息的解决方法介绍

以下是对android真机调试时无法显示logcat信息的解决方法进行了详细的分析介绍,需要的朋友可以过来参考下   android真机调试时无法显示logcat信息的解决方法介绍: window-->show view-->android->devices, 打开devices,点击右边的截屏图片的按钮.等到出现截图的时候,logcat就出来信息了!

ios开发在表视图显示cell里的内容时出现failed to obtain a cell from its datasource

问题描述 ios开发在表视图显示cell里的内容时出现failed to obtain a cell from its datasource 这是代码 -(NSInteger)tableView:(UITableView )tableView numberOfRowsInSection:(NSInteger)section{ return 1; } -(UITableViewCell)tableView:(UITableView )tableView cellForRowAtIndexPath:

视频的播放-Android页面显示多个视频时如何控制声音显示哪个视频的声音

问题描述 Android页面显示多个视频时如何控制声音显示哪个视频的声音 最近开始学习Android,我试着在一个画面中画了3个视频,请问如何控制声音显示哪个视频的声音啊,我想要的效果是可以加入焦点进入,移动焦点在哪个视频上就显示哪个视频的声音.但是不知道如何实现.请大牛们帮忙~~~~

Android的Fragment 进入时显示正在加载

问题描述 Android的Fragment 进入时显示正在加载 像微信那样,地址四个功能,点击尚为加载的Fragment显示 一个在加载的进度条(圆形的)不是ProgressDialog喔, 没有思路.

在android中设计电子词典时查询之后显示未找到内容是因为没有链接到数据库吗

问题描述 在android中设计电子词典时查询之后显示未找到内容是因为没有链接到数据库吗 在android中设计电子词典时查询之后显示未找到内容是因为没有链接到数据库吗 解决方案 先搞明白是不是用了数据库,如果我用了,你就去查具体的查找代码,估计是没有匹配上