永发信息网

Android 内存溢出怎么解决

答案:2  悬赏:50  手机版
解决时间 2021-02-08 08:07
在运行大数据读取时,出现内存溢出异常
最佳答案
Android虽然会自动管理内存,JAVA也有garbage collection (GC )内存回收机制。但是如果程序在一次操作中打开几个M的文件,那么通常会出现下面的错误信息。02-04 21:46:08.703: ERROR/dalvikvm-heap(2429): 1920000-byte external allocation too large for this process.

02-04 21:52:28.463: ERROR/AndroidRuntime(2429): java.lang.OutOfMemoryError: bitmap size exceeds VM budget移动终端因为内存有限,往往图片处理经常出现上述的错误。解决方法:1.明确调用System.gc(); 这种内存回收会有一定的作用,但是请不要太期待。2.图片处理完成后回收内存。 请在调用BitMap进行图片处理后进行内存回收。 bitmap.recycle(); 这样会把刚刚用过的图片占用的内存释放。3.图片处理时指定大小。 下面这个方法处理几个M的图片时是必须的BitMap getBitpMap(){ ParcelFileDescriptor pfd; try{ pfd = mCon.getContentResolver().openFileDescriptor(uri, "r"); }catch (IOException ex){ return null; } java.io.FileDescriptor fd = pfd.getFileDescriptor(); BitmapFactory.Options options = new BitmapFactory.Options(); //先指定原始大小 options.inSampleSize = 1; //只进行大小判断 options.inJustDecodeBounds = true; //调用此方法得到options得到图片的大小 BitmapFactory.decodeFileDescriptor(fd, null, options); //我们的目标是在800pixel的画面上显示。 //所以需要调用computeSampleSize得到图片缩放的比例 options.inSampleSize = computeSampleSize(options, 800); //OK,我们得到了缩放的比例,现在开始正式读入BitMap数据 options.inJustDecodeBounds = false; options.inDither = false; options.inPreferredConfig = Bitmap.Config.ARGB_8888; //根据options参数,减少所需要的内存 Bitmap sourceBitmap = BitmapFactory.decodeFileDescriptor(fd, null, options); return sourceBitmap; } //这个函数会对图片的大小进行判断,并得到合适的缩放比例,比如2即1/2,3即1/3 static int computeSampleSize(BitmapFactory.Options options, int target) { int w = options.outWidth; int h = options.outHeight; int candidateW = w / target; int candidateH = h / target; int candidate = Math.max(candidateW, candidateH); if (candidate == 0) return 1; if (candidate > 1) { if ((w > target) && (w / candidate) < target) candidate -= 1; } if (candidate > 1) { if ((h > target) && (h / candidate) < target) candidate -= 1; } if (VERBOSE) Log.v(TAG, "for w/h " + w + "/" + h + " returning " + candidate + "(" + (w/candidate) + " / " + (h/candidate)); return candidate; }
全部回答
一、内存溢出 现在的智能手机内存已经足够大,但是对于一个应用程序来说智能手机当中稀缺的内存,仍然是应用程序的一大限制。在android应用程序开发当中,最常见的内存溢出问题(oom)是在加载图片时出现的,尤其是在不知道图片大小的情况下。 潜在的内存溢出操作主要包括以下几点: 1、从网络当中加载用户特定的图片。因为直到我们在下载图片的时候我们才知道图片的大小。 2、向gallery加载图片。因为现在智能手机的摄像头有很高的分辨率,在加载图片的时候需要最图片进行处理,然后才能正常的使用。 请注意一点,android系统是从系统全局的观念来分配内存以加载图片的,这就意味着,即使你的应用有足够大的内存可用,内存溢出问题(out of memroy,oom)仍然可能出现,因为所有的应用共享一个加载图片的内存池(我们使用bitmapfactory进行解析)。 二、解决内存溢出问题 原文(downsampling为了好理解,解释为,程序a)。程序a通过调整像素,同时使其均衡化来降低图片的分辨率。因为不管问题图片是因为太大而不能再手机上正常显现,这个图片都会缩短其宽度以在imageview当中显示,当图片在imageview当中显示时,我们会因为加载一些没有必要的原始图片而浪费掉内存。 因此,更加有效的加载图片的时机是在其初始化处理的时候。 以下是处理代码: 1: private static bitmap getresizedimage(string path, byte[] data, int targetwidth){2:3: bitmapfactory.options options = new bitmapfactory.options(); 14: options.insamplesize = ssize;15:16: bitmap bm = null;17: try{18: bm = decode(path, data, options); 19: }catch(outofmemoryerror e){ 39: result = result * 2;40:41: }42:43: return result;44: }三、aquery当在android应用程序开发当中使用aquery组件时,处理这个问题会变的更加的简单。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
人死后还会托生原来的家吗
原来买的是k字头的火车票可以改买G字头
于田县阿羌营业厅地址在什么地方,想过去办事
吉林市怎么坐什么车才能到四平市梨树县?我要
一根钢管长18米,第一次用去了4分之3,第二次又
于田县阿日希营业厅怎么去啊,我要去那办事
我更改了一下电脑账户,然后发现数据都没了,
于田县羊场营业厅地址有知道的么?有点事想过
求翻译he rejects it as being ungrounded,
湖南省农科院科技交流中心这个地址在什么地方
什么样的霉菌在平板计数琼脂培养基上不到一夜
崔武丽口腔诊所地址在什么地方,想过去办事
于田县英巴格营业厅地址在什么地方,想过去办
博雅羝羊触藩残局破解
于田县托格日尕孜营业厅地址在什么地方,想过
推荐资讯
七天酒店停车场(昆仑路辅路东200米七天酒店停
妈妈说我们是坏孩子,我们将会被历史铭记 外
恒大名都花园南区停车场(出入口)地址在什么地
室内表面为坚硬材料的大空间,有时需要进行吸
英国工业革命中,世界上第一辆火车的发明者是
三川镇爱心双语幼儿园地址在什么地方,想过去
酸菜鱼地址在什么地方,想过去办事
【高考数学填空题】数学高考各大题都多少分北
3ds小黄纸有有效期吗
软银为什么要取消蔚来投资
手机爱奇艺PPS离线文件删除了怎么内存不减
绿川小区西区地址有知道的么?有点事想过去
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?