您的位置:首页 > 移动开发 > Android开发

关于Android out of memory解决办法的总结

2016-10-12 10:09 423 查看
最近在做一个安卓项目,由于app里面加载了大量的GIF而且必须不断在后台循环播放,
以至于当我做一个异步加载的listview的时候加载图片稍多点或者跳转页面的到显示大图的时候就会出现OOM的情况。
对于这样的问题我用了两个办法解决。


1.listview不必再内存中吃入全部图片,
对图片使用软引用只有当listview的图片需要显示到屏幕上时才需要将图片加载到内存,
对于跑出屏幕显示范围的图片如果使用软引用可以及时地回收这样不会造成OOM。
对于软引用构建缓冲区具体可以参考http://zhangjunhd.blog.51cto.com/113473/53092/,
异步加载图片可以参考 http://blog.csdn.NET/cike110120/article/details/8976169


2.加载图片的时候不要一味求大求清晰,可以对图片进行适当的降采样,再加载进内存,
我是试过如果1M以上的图片如果降采样10倍加载到内存显示在小米2手机上基本是看不出什么变化,
这样可以极大地缓解内存需求。
Options opts = new Options();
opts.inSampleSize=10;
Bitmap data= BitmapFactory.decodeFile(url);
这样图片的品质只有原来的十分之一。


3.对于不用的activity和需要及时地finish,少用阻塞线程。


4.MemoryLeak
在Java中内存泄漏是只,某个(某些)对象已经不在被使用应该被gc所回收,
但有一个对象持有这个对象的引用而阻止这个对象被回收。
比如我 们通常会这样创建一个View TextView tv = new TextView(this);
这里的this通常都是Activity。所以这个TextView就持有着这个Activity的引用。
下面看张图 (Google IO 2011 ppt中抄得)通常情况下,当用户转动手机的时候,
Android会重新调用OnCreate()方法生成一个新的Activity,原来的 Activity应该被GC所回收。
但如果有个对象比如一个View的作用域超过了这个Activity(比如有一个static对象或者我们把这个 View的引用放到了Application当中),
这时候原来的Activity将不能被GC所回收,Activity本身又持有很多对象的引用,
所以 整个Activity的内存被泄漏了。


备注:经常导致内存泄漏核心原因:

keeping a long-lived reference to a Context.持有一个context的对象,从而gc不能回收。

情况如下:

1.一个View的作用域超出了所在的Activity的作用域,
比如一个static的View或者把一个View cache到了application当中 etc
理解:内存:注意静态的数据和缓存中的数据;注意释放;


2.某些与View关联的Drawable的作用域超出了Activity的作用域。


3.Runnable对象:比如在一个Activity中启用了一个新线程去执行一个任务,
在这期间这个Activity被系统回收了,
但Runnalbe的 任务还没有执行完毕并持有Activity的引用而泄漏,
但这种泄漏一般来泄漏一段时间,只有Runnalbe的线程执行完闭,这个 Activity又可以被正常回收了。


4.内存类的对象作用域超出Activity的范围:比如定义了一个内存类来存储数据,
又把这个内存类的对象传给了其它Activity 或者Service等。
因为内部类的对象会持有当前类的引用,所以也就持有了Context的引用。
解决方法是如果不需要当前的引用把内部类写成static或者,把内部类抽取出来变成一个单独的类,
或者把避免内部对象作用域超出Activity的作用域。
out Of Memery Error 在android中每一个程序所分到的内存大小是有限的,
如果超过了这个数就会报Out Of Memory Error。 android给程序分配的内存大小与手机硬件有关,
以下是一些手机的数据:
G1:16M Droid:24 Nexus One:32M Xoom:48Ms


所以尽量把程序中的一些大的数据cache到本地文件。以免内存使用量超标。

记得数据传递完成之后,把存放在application的HashMap中的数据remove掉,以免发生内存的泄漏**
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: