80,351
社区成员
发帖
与我相关
我的任务
分享
public long availMem The total available memory on the system.
public boolean lowMemory Set to true if the system considers itself to currently be in a low memory situation.
public long threshold The threshold of availMem at which we consider memory to be low and start killing background services and other non-extraneous processes.
6.Android框架,每一个进程都有内存限制,可以采用以下方法来躲开这个问题
每一个程序可以通过android.os.Debug.getNativeHeapAllocatedSize()查看进程可以使用的内存。
一种方法是从本机代码分配内存。使用NDK的(本地开发工具包)和JNI,它可以从C级(如的malloc / free或新/删除),这种分配的内存分配,不计入内存的限制。
另一种方法,效果很好,图像,是使用OpenGL纹理 - 纹理内存同样不被计入内存的限制
据说可以达到300M的内存使用,哪位朋友测试了可以告诉我,这个方法的可行性。
在使用Gallery控件时,如果载入的图片过多,过大,就很容易出现OutOfMemoryError异常,就是内存溢出。这是因为Android默认分配的内存只有8M,而载入的图片如果是JPG之类的压缩格式,在内存中展开时就会占用大量的空间,也就容易内存溢出。这时可以用下面的方法解决:
1
2
3
4
5
6
7
8
9
10
ImageView i = new ImageView(mContext);
BitmapFactory.Options options=new BitmapFactory.Options();
options.inSampleSize = 10;
//貌似这个options的功能是返回缩略图,10即表示长和宽为原来的1/10,即面积为原来的1/100
//缩略图可以减少内存占用
Bitmap bm = BitmapFactory.decodeFile(lis.
get(position).toString(),options);
i.setImageBitmap(bm);
bm.recycle();
//资源回收
我的代码如下
is = new FileInputStream(new File(baseMagazinePath + this.bookId + "/" + fileList[currentImgNo] + ".png"));
iv.setImageDrawable(Drawable.createFromStream(is, "myStream"));
有时候出现内存溢出
改为
is = new FileInputStream(new File(baseMagazinePath + this.bookId + "/" + fileList[currentImgNo] + ".png"));
BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inSampleSize = 4;
Bitmap bitmap = BitmapFactory.decodeStream(is, null, opts);
iv.setImageBitmap(bitmap);
就好了。
最近在做一个应用,要循环显示图片,可是图片很大,每个5M左右,如果按图片原来大小显示,在显示两个图片之后必会内存溢出,谁能给个图片压缩显示方法,谢谢!!!
--------------------------------------------------------------------------------
以下为可能性最大的答案:
........5M
这个就算recycle也没用了...
我觉得你可以这样,创建一张全局的bitmap(当然要按最大的创建),然后每个图片读取都按照字节的方式读出来,之后set个体这个全局的bitmap,显示的时候就显示这个全局的,一个用完就清空一下,在读取另一张,这样保证只有一个bitmap在占用内存....
--------------------------------------------------------------------------------
recycle并不能及时回收图片,只是告诉虚拟机我需要回收该图片资源,Java中没有手工回收资源的方法。。
1、修改android底层的内存限制。。。放开内存
2、用楼上的做法进行缩放, opts.inSampleSize = 2;表明缩放为原图的长宽各一半。。。用弱引用引用图片,保证及时的回收。。
--------------------------------------------------------------------------------
执行了bitmap.recycle()后,直接让bitmap对象赋予null,这样可以立即释放的。不过要说的是android处理大图片很愁人的,ram太小了,没办法,vm限制也大,哈哈
J2ME中最常使用的资源无非是图片和声音。为了提高游戏的运行速度,我们通常把它们声明为全局变量,又由于手机的内存的关系,我们不能把这些资源同时加载进内存,所以我们会在使用的时候导入资源(创建对象),而把暂时不需要的资源(图片或声音)对象赋值为null(当然这是我的做法,不知道是否和大家一样)。在这期间如果处理不好,就会有些资源对象的在内存中没有清除干净,就会造成内存泄漏,结果就是可用内存越来越小。下面我就举例说明。
?n u M+|$c;t5j0 Android J2ME u(U@1| u%FIz-a!B
1.图片资源Android J2ME ` V(B;b d2KU
要点:要为每一个图片资源声明一个对象变量
x sZ7L�ts[3E~2m0 假设在一个程序声明了2个图片对象:
8j;db7S!S ^.BV�l0 Image pic1,pic2;
os&E+Q\"M#B6x0 如果在某一时刻要使用pic1和pic2则:
/T ov3x0u){ l0 if(pic1==null)pic1=Image.createImage("/1.png");Android J2ME !dk3n[D$J!@#Q
if(pic2==null)pic2=Image.createImage("/2.png");Android J2ME )S'O�e0p3l{'S#L
当这些图片用完后,就应当:
(b{6wQU3u0 pic1=null;
.iWl3R,~%d0 pic2=null;
%A7o VR+m@H0 如果需要使用另外两个图片3.png和4.png,则最好另声明两个变量对象pic3,pic4来导入它们,不要使用pic1,pic2变量来导入这两个图片,如:Android J2ME (oQ @,m_
if(pic1==null)pic1=Image.createImage("/3.png");//不要这样做Android J2ME "vI"b9UJm s
if(pic2==null)pic2=Image.createImage("/4.png");//不要这样做Android J2ME 3_*L\ eFEl__
因为这样做会影响垃圾收集器对pic1,pic2对象的回收工作,从而造成内存回收不干净。
.q8lz-[(lj0 Android J2ME ;]G*D4m:Bh\.@_
2.声音资源(不同的平台对声音的处理方式不同)Android J2ME m8H2C QK@B
Android J2ME /I{(j]@
要点:和图片资源一样,另外在回收声音资源一定要停止声音的播放;还有在每次开始播放声音前,也要先判断一下声音的状态(简单点,直接调用stop,先让声音停下来,然后再播放),如果不先停止声音的播放,再调用其运行播放,可能会生成无法回收的对象(这是本人猜测的)造成内存的泄漏。
r o,OSS0
&YP;k6Z0H i0 如:
+d{K[jFcB0 假设sound为声音对象jAndroid J2ME 3V.}4KTw1F!j+h�L.q!R%KN
释放sound资源:
9d8J6HY Ne$s{D4K;I0 if(sound!=null)
!V]S0X.m#}3c#f0 {Android J2ME :O6C$L c