Android outofmemory错误位图大小超过2.3.3中的vm预算

GSr*_*ree 11 android android-emulator android-layout

我知道这问题很少见.他们都没有清楚解决方案.让我解释一下这个问题.

  1. 我有一个Activity,一次加载4个图像.
  2. 我在onResume()方法中加载图像.
  3. 加载时,Activity会引发位图错误.

笔记.

  1. 我使用setImageResource(R.drawable.xxxx)方法调用设置图像,而不是直接使用bitmap/drawables.
  2. 图像正确缩放.
  3. 活动在2.3之前的所有模拟器中都运行良好,并且在实际设备(三星Galaxy 5)中工作精细
  4. 错误出现在首次初始化时,并且不会触发方向更改事件.
  5. 图像尺寸为800 x 600,平均尺寸为15kb(每个).

让我知道任何解决方案.如果你有与Android 2.3.3模拟器类似的问题,也请告诉我.

[更新] -snippets

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
            ...
    img_topLeft = (ImageView) findViewById(R.id.Img_Alph_Q_TopLeft);
    img_topRight = (ImageView) findViewById(R.id.Img_Alph_Q_TopRight);
    img_bottomLeft = (ImageView) findViewById(R.id.Img_Alph_Q_BottomLeft);
    img_bottomRight = (ImageView) findViewById(R.id.Img_Alph_Q_BottomRight);
   ...
   }
protected void onResume() {
    super.onResume();
            img_topLeft.setImageResource(R.drawable.xxx);
            img_topRight.setImageResource(R.drawable.xxx);
            img_bottomLeft.setImageResource(R.drawable.xxx);
            img_bottomRight.setImageResource(R.drawable.xxx);
   ...
   }
Run Code Online (Sandbox Code Playgroud)

03-21 08:59:17.362:ERROR/dalvikvm-heap(5883):4320000字节的外部分配对于此过程来说太大了.03-21 08:59:17.412:ERROR/GraphicsJNI(5883):VM不允许我们分配4320000字节03-21 08:59:17.432:ERROR/AndroidRuntime(5883):致命异常:主03-21 08: 59:17.432:ERROR/AndroidRuntime(5883):java.lang.OutOfMemoryError:位图大小超过VM预算03-21 08:59:17.432:ERROR/AndroidRuntime(5883):at android.graphics.Bitmap.nativeCreate(Native Method) 03-21 08:59:17.432:ERROR/AndroidRuntime(5883):在android.graphics.Bitmap.createBitmap(Bitmap.java:477)03-21 08:59:17.432:ERROR/AndroidRuntime(5883):在android. graphics.Bitmap.createBitmap(Bitmap.java:444)03-21 08:59:17.432:ERROR/AndroidRuntime(5883):在android.graphics.Bitmap.createScaledBitmap(Bitmap.java:349)03-21 08:59: 17.432:ERROR/AndroidRuntime(5883):在android.graphics.BitmapFactory.finishDecode(BitmapFactory.java:498)03-21 08:59:17.432:ERROR/AndroidRuntime(5883):在android.graphics.BitmapFactory.decodeStream(BitmapFactory) .java:473)03-21 08:59:17.432:ERROR/AndroidRuntime(5883):在android.graphics.BitmapFact ory.decodeResourceStream(BitmapFactory.java:336)03-21 08:59:17.432:ERROR/AndroidRuntime(5883):在android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:697)03-21 08:59: 17.432:ERROR/AndroidRuntime(5883):在android.content.res.Resources.loadDrawable(Resources.java:1709)03-21 08:59:17.432:ERROR/AndroidRuntime(5883):在android.content.res.Resources .getDrawable(Resources.java:581)03-21 08:59:17.432:ERROR/AndroidRuntime(5883):在android.widget.ImageView.resolveUri(ImageView.java:501)03-21 08:59:17.432:ERROR/AndroidRuntime(5883):在android.widget.ImageView.setImageResource(ImageView.java:280)03-21 08:59:17.432:ERROR/AndroidRuntime(5883):at Quiz.java:124)03-21 08:59 :17.432:ERROR/AndroidRuntime(5883):Quiz.onResume(Quiz.java:92)03-21 08:59:17.432:ERROR/AndroidRuntime(5883):at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1150 )03-21 08:59:17.432:ERROR/AndroidRuntime(5883):在android.app.Activity.performResume(Activity.java:3832))03-21 08:59:17.432:ERROR/AndroidRuntime(5883):在android.app.ActivityThread.performResumeActivity(ActivityThread.java:2110)03-21 08:59:17.432:ERROR/AndroidRuntime(5883):at android .app.ActivityThread.handleResumeActivity(ActivityThread.java:2135)03-21 08:59:17.432:ERROR/AndroidRuntime(5883):at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1668)03-21 08:59 :17.432:ERROR/AndroidRuntime(5883):在android.app.ActivityThread.access $ 1500(ActivityThread.java:117)03-21 08:59:17.432:ERROR/AndroidRuntime(5883):在android.app.ActivityThread $ H .handleMessage(ActivityThread.java:931)03-21 08:59:17.432:ERROR/AndroidRuntime(5883):at android.os.Handler.dispatchMessage(Handler.java:99)03-21 08:59:17.432:ERROR/AndroidRuntime(5883):在android.os.Looper.loop(Looper.java:123)03-21 08:59:17.432:ERROR/AndroidRuntime(5883):在android.app.ActivityThread.main(ActivityThread.java: 3683)03-21 08:59:17.432:ERROR/AndroidRuntime(5883):at java.lang.reflect.Method.invokeNat ive(Native Method)03-21 08:59:17.432:ERROR/AndroidRuntime(5883):at java.lang.reflect.Method.invoke(Method.java:507)03-21 08:59:17.432:ERROR/AndroidRuntime (5883):at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:839)03-21 08:59:17.432:ERROR/AndroidRuntime(5883):at com.android.internal.os. ZygoteInit.main(ZygoteInit.java:597)03-21 08:59:17.432:ERROR/AndroidRuntime(5883):at dalvik.system.NativeStart.main(Native Method)

谢谢.管理解决它.共享代码以获得其他人的利益解决此问题的自定义类.基于@ Janardhanan.S链接.

public class BitmapResizer {

public static Bitmap decodeImage(Resources res, int id ,int requiredSize){
    try {
        BitmapFactory.Options o = new BitmapFactory.Options();
        o.inJustDecodeBounds = true;
        BitmapFactory.decodeResource(res, id, o);

        //Find the correct scale value. It should be the power of 2.
        final int REQUIRED_SIZE=requiredSize;
        int width_tmp=o.outWidth, height_tmp=o.outHeight;
        int scale=1;
        while(true){
            if(width_tmp/2<REQUIRED_SIZE || height_tmp/2<REQUIRED_SIZE)
                break;
            width_tmp/=2;
            height_tmp/=2;
            scale*=2;
        }

        //decode with inSampleSize
        BitmapFactory.Options o2 = new BitmapFactory.Options();
        o2.inSampleSize=scale;
        return BitmapFactory.decodeResource(res, id, o2);
    } catch (Exception e) {

    }
    return null;
}

}

//Class call
int requiredsize = 100; // Still playing around with this number to find the optimum value
img_topLeft.setImageBitmap(BitmapResizer.decodeImage(getResources(),
        AlphResourceSet.R.drawable.xxx, requiredsize));
Run Code Online (Sandbox Code Playgroud)

Jan*_*ana 3

位图占用大量内存空间。不要为您在 Activity 上加载的所有图像创建新的位图变量,而是可以创建一个位图变量并尽可能地重复使用它们。

您可以使用此片段来调整位图大小

http://pastebin.com/D8vbQd2u