青岛专业做商业房的网站,合同模板网站,做足彩推荐赚钱的网站,网站推荐2021Android加载图片时#xff0c;对于分辨率小#xff0c;配置低的机子#xff0c;很容易发生OutOfMemoryError。手机的内存比图片的大很多#xff0c;怎么会这样#xff1f; 在设置Android虚拟机的内存时#xff1a; RAM#xff1a;模拟器的内存空间 VM Heap#xff1a;…Android加载图片时对于分辨率小配置低的机子很容易发生OutOfMemoryError。手机的内存比图片的大很多怎么会这样 在设置Android虚拟机的内存时 RAM模拟器的内存空间 VM Heapdalvik虚拟机最大占用内存也就是单个进程的最大占用内存。 VM Heap高配的手机可能有32M,64M,128M而低配的手机一般是16M分辨率越大的手机一般分配的也比较多。
Android系统对dalvik的vm heapsize作了硬性限制当java进程申请的java空间超过阈值时就会抛出OOM异常。也就是说RAM充足也会发生OOM的异常。
--------------------
VM Heap大小16mb当应用加载一张大图时加载图片所需要的内存空间不是按照图片大小算的而是按照图片的像素点来算的。
图片像素点计算
1张叫juhua.jsp的图片大小1.27MB分辨率3840*216024位。 * Android保存图片像素信息是用ARGB保存* A0-255,需要一个长度为8的二进制数字占用1个字节 * R0-255,需要一个长度为8的二进制数字占用1个字节 * G0-255,需要一个长度为8的二进制数字占用1个字节 * B0-255,需要一个长度为8的二进制数字占用1个字节 3840*2160*433177600字节/1024/102431.640MB 超过了VM Heap的16MB报内存溢出 10-27 06:16:27.645: I/dalvikvm-heap(1894): Forcing collection of SoftReferences for 33177612-byte allocation 10-27 06:16:27.645: E/dalvikvm-heap(1894): Out of memory on a 33177612-byte allocation. 10-27 06:16:27.655: E/AndroidRuntime(1894): Caused by: java.lang.OutOfMemoryError ************************************ 解决方法 按比例缩小图片再加载。 现有手机屏幕分辨率 320*480 宽比3840/32012 高比2160/4804 选择比例大的数字12 缩放后再设置就不会溢出了。 31.640MB/122.64mb 代码例子 RelativeLayout xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:toolshttp://schemas.android.com/toolsandroid:layout_widthmatch_parentandroid:layout_heightmatch_parenttools:context.MainActivity Buttonandroid:idid/btn1android:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:text点击加载大图片(OOO)android:onClickloadPic/Buttonandroid:idid/btn2android:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:layout_belowid/btn1android:text点击缩放加载大图片android:onClickscaleLoadPic/ImageView android:idid/iv_picandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:layout_belowid/btn2//RelativeLayout package com.example.loadbigpic;import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.BitmapFactory.Options;
import android.os.Bundle;
import android.view.Display;
import android.view.View;
import android.widget.ImageView;public class MainActivity extends Activity {Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}public void loadPic(View v){/** BitmapFactory.decodeResource* 这个带两个参数的方法第一个参数是包含你要加载的位图资源文件的对象一般写成 getResources就ok了* 第二个时你需要加载的位图资源的Id。BitmapFactory.decodeResource带三个参数的方法前两个和上面的方法一样。第三个参数应该是对你要加载的位图是否需要完整显示如果你只需要部分可以在这里定制。*/Bitmap bmBitmapFactory.decodeResource(getResources(),R.drawable.juhua);ImageView iv_pic(ImageView) findViewById(R.id.iv_pic);iv_pic.setImageBitmap(bm);}public void scaleLoadPic(View v){Options optsnew Options();//默认为false设为true则decoder返回null//即BitmapFactory.decodeResource(getResources(),R.drawable.juhua,opts);返回null//但会返回图片的参数的信息到Options对象里//不解析图片到内存里opts.inJustDecodeBoundstrue;BitmapFactory.decodeResource(getResources(),R.drawable.juhua,opts);//获取图片的宽高int imageWidthopts.outWidth;int imageHeigthopts.outHeight;//获取屏幕的高宽Display dpgetWindowManager().getDefaultDisplay();//在高版本里有新的方法获取但图片加载是常用功能要兼容低版本所以过时了也用int screenWidthdp.getWidth();int screenHeightdp.getHeight();//计算缩放比例int scale1;int scaleWidthimageWidth/screenWidth;int scaleHeightimageHeigth/screenHeight;//取缩放比例取那个大的值if(scaleWidthscaleHeight scaleWidth1){scalescaleWidth;}else if(scaleWidthscaleHeight scaleHeight1){scalescaleHeight;}//设置缩放比例opts.inSampleSizescale;opts.inJustDecodeBoundsfalse;Bitmap bmBitmapFactory.decodeResource(getResources(),R.drawable.juhua,opts);ImageView iv_pic(ImageView) findViewById(R.id.iv_pic);iv_pic.setImageBitmap(bm);}}