内存泄露,简称OOM(OutOfMemory)。区别于Web开发、PC端程序开发,Android程序开发有一个很大的限制:设备资源有限。当Android应用程序处理较大内存资源如图片、音乐、视频等多媒体资源时,在资源数量过多、处理时间过久的状况下,很容易耗尽设备资源,此时,内存泄露就发生了。函数
那么,什么样的Android程序容易引发OOM呢?如下来自我开发Android应用程序的总结和网上收集的资料。优化
1.bitmap处理不当引发的OOMspa
Bitmap占用资源大,很容易吃完内存,这也是内存溢出问题里最为常见的问题。code
为了有效优化处理Bitmap带给咱们的内存问题,咱们应当注意如下几点。视频
a.及时销毁blog
用完Bitmap后,要及时recycle。recycle不能保证当即释放Bitmap,但会给虚拟机一个暗示:"该图片能够释放了"。生命周期
if(!bitmapObject.isRecycle()){ bitmapObject.recycle(); }
b.适时使用软引用图片
回收bitmap时调用recycle()方法,该方法只能在bitmap放弃全部引用的状况下才能回收,不然会报使用已回收的bitmap的错误。然而咱们使用bitmap时,大多数时间是建立的局部变量,引用这些bitmap的控件倒是全局的,或者说有更长的生命周期,因此回收bitmap要在控件再也不引用该资源的状况下调用recycle()方法,这也是常常调用recycle()方法不成功而放弃回收bitmap的缘由。另外,有些时候,咱们使用Bitmap后没有保留对它的引用,所以就没法调用Recycle函数。这时候巧妙的运用软引用,可使Bitmap在内存快不足时获得有效的释放。 内存
private class MyAdapter extends BaseAdapter { private ArrayList> mBitmapRefs = new ArrayList>(); public View getView(int i, View view, ViewGroup viewGroup) { View newView = null; if(view != null) { newView = view; } else { newView =(View)mInflater.inflate(R.layout.image_view, false); } Bitmap bitmap = BitmapFactory.decodeFile(mValues.get(i).fileName); mBitmapRefs.add(new SoftReference(bitmap)); //此处加入ArrayList ((ImageView)newView).setImageBitmap(bitmap); return newView; } }
c.适时减少生成的bitmap占用空间资源
当要显示的区域很小,不必将整个图片都加在出来,只须要加载一个缩小过的图片,能够设置适当的采样率,就能够有效减少占用的内存。
private ImageView preview; BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = 2;//图片宽高都为原来的二分之一,即图片为原来的四分之一 Bitmap bitmap = BitmapFactory.decodeStream(cr.openInputStream(uri), null, options); preview.setImageBitmap(bitmap);