加载资源onCreate casusing java.lang.OutOfMemoryError

时间:2013-04-01 15:40:55

标签: android exception out-of-memory android-resources android-drawable

我在onCreate上添加了一些资源,它在Android 2.2到2.3.x上工作正常,但在4.0以下崩溃是代码片段

我已将所有资源放在drawable-mdpi中,这可能是个问题吗?

private List<Drawable> drawables;
private void getDrawablesList() {

    drawables = new ArrayList<Drawable>();
    for(int i=0; i<26; i++)
        drawables.add(getResources().getDrawable(Utility.getImageIDofGalleryAlphabets(i)));

}
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.gallery);

    getDrawablesList();
    setupUI();
}

我在行

之后的getDrawablesList中遇到异常
drawables.add(getResources().getDrawable(Utility.getImageIDofGalleryAlphabets(i)));

以下是崩溃日志:

FATAL EXCEPTION: main
java.lang.OutOfMemoryError
    at android.graphics.Bitmap.nativeCreate(Native Method)
    at android.graphics.Bitmap.createBitmap(Bitmap.java:605)
    at android.graphics.Bitmap.createBitmap(Bitmap.java:551)
    at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:437)
    at android.graphics.BitmapFactory.finishDecode(BitmapFactory.java:524)
    at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:499)
    at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:351)
    at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:773)
    at android.content.res.Resources.loadDrawable(Resources.java:1937)
    at android.content.res.Resources.getDrawable(Resources.java:664)
    at com.rdx.gallery.GalleryDemoActivity.getDrawablesList(GalleryDemoActivity.java:180)
    at com.rdx.gallery.GalleryDemoActivity.onCreate(GalleryDemoActivity.java:65)
    at android.app.Activity.performCreate(Activity.java:4635)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1970)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2031)
    at android.app.ActivityThread.access$600(ActivityThread.java:126)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1166)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:4486)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
    at dalvik.system.NativeStart.main(Native Method)
04-01 08:31:28.894: I/Process(11767): Sending signal. PID: 11767 SIG: 9
04-01 08:31:28.894: E/AndroidRuntime(11767): Handle UnCaght exceptions. KILLING PID: 11767

我知道我正在加载26个资源。 26张图片的总大小= 2.57 MB,我认为这个图片太大了。

出了什么问题?请分享您的观点

1 个答案:

答案 0 :(得分:1)

虽然它可能只有2.5M,但Android会根据设备的像素密度和显示尺寸来扩展资源。一旦加载并准备好使用,它可能会变得更多。此外,有些设备没有大量内存。某些设备上可能只有16M,并且您与Android以及可能在后台运行的任何其他应用共享该空间。我的猜测是你的4.0设备为Android使用的内存比2.x设备更多,而你之前的内存已经用完了。

如果您真的需要所有这些图像,也许您可​​以构建一个只加载当时所需内容的解决方案,并释放它不需要的内容。屁股很痛,但这些设备的内存非常有限