2013-08-08 5 views
0

Я пытаюсь установить фон в своем приложении, которое будет хорошо масштабироваться на планшетах, а также на телефонах. Таким образом, я получил png-фон, размер которого равен 2560 к 1600, но размером всего 44 КБ. Однако каждый раз, когда я запускаю приложение, я все время получаю это.Я продолжаю получать ошибку java.lang.outofmemory

08-08 14:50:21.251: E/AndroidRuntime(2924): FATAL EXCEPTION: main 
08-08 14:50:21.251: E/AndroidRuntime(2924): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.reflap.reflap/com.reflap.reflap.MainActivity}: android.view.InflateException: Binary XML file line #7: Error inflating class <unknown> 
08-08 14:50:21.251: E/AndroidRuntime(2924):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211) 
08-08 14:50:21.251: E/AndroidRuntime(2924):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261) 
08-08 14:50:21.251: E/AndroidRuntime(2924):  at android.app.ActivityThread.access$600(ActivityThread.java:141) 
08-08 14:50:21.251: E/AndroidRuntime(2924):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256) 
08-08 14:50:21.251: E/AndroidRuntime(2924):  at android.os.Handler.dispatchMessage(Handler.java:99) 
08-08 14:50:21.251: E/AndroidRuntime(2924):  at android.os.Looper.loop(Looper.java:137) 
08-08 14:50:21.251: E/AndroidRuntime(2924):  at android.app.ActivityThread.main(ActivityThread.java:5103) 
08-08 14:50:21.251: E/AndroidRuntime(2924):  at java.lang.reflect.Method.invokeNative(Native Method) 
08-08 14:50:21.251: E/AndroidRuntime(2924):  at java.lang.reflect.Method.invoke(Method.java:525) 
08-08 14:50:21.251: E/AndroidRuntime(2924):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
08-08 14:50:21.251: E/AndroidRuntime(2924):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
08-08 14:50:21.251: E/AndroidRuntime(2924):  at dalvik.system.NativeStart.main(Native Method) 
08-08 14:50:21.251: E/AndroidRuntime(2924): Caused by: android.view.InflateException: Binary XML file line #7: Error inflating class <unknown> 
08-08 14:50:21.251: E/AndroidRuntime(2924):  at android.view.LayoutInflater.createView(LayoutInflater.java:620) 
08-08 14:50:21.251: E/AndroidRuntime(2924):  at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56) 
08-08 14:50:21.251: E/AndroidRuntime(2924):  at android.view.LayoutInflater.onCreateView(LayoutInflater.java:669) 
08-08 14:50:21.251: E/AndroidRuntime(2924):  at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:694) 
08-08 14:50:21.251: E/AndroidRuntime(2924):  at android.view.LayoutInflater.rInflate(LayoutInflater.java:755) 
08-08 14:50:21.251: E/AndroidRuntime(2924):  at android.view.LayoutInflater.inflate(LayoutInflater.java:492) 
08-08 14:50:21.251: E/AndroidRuntime(2924):  at android.view.LayoutInflater.inflate(LayoutInflater.java:397) 
08-08 14:50:21.251: E/AndroidRuntime(2924):  at android.view.LayoutInflater.inflate(LayoutInflater.java:353) 
08-08 14:50:21.251: E/AndroidRuntime(2924):  at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:267) 
08-08 14:50:21.251: E/AndroidRuntime(2924):  at android.app.Activity.setContentView(Activity.java:1895) 
08-08 14:50:21.251: E/AndroidRuntime(2924):  at com.reflap.reflap.MainActivity.onCreate(MainActivity.java:18) 
08-08 14:50:21.251: E/AndroidRuntime(2924):  at android.app.Activity.performCreate(Activity.java:5133) 
08-08 14:50:21.251: E/AndroidRuntime(2924):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 
08-08 14:50:21.251: E/AndroidRuntime(2924):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175) 
08-08 14:50:21.251: E/AndroidRuntime(2924):  ... 11 more 
08-08 14:50:21.251: E/AndroidRuntime(2924): Caused by: java.lang.reflect.InvocationTargetException 
08-08 14:50:21.251: E/AndroidRuntime(2924):  at java.lang.reflect.Constructor.constructNative(Native Method) 
08-08 14:50:21.251: E/AndroidRuntime(2924):  at java.lang.reflect.Constructor.newInstance(Constructor.java:417) 
08-08 14:50:21.251: E/AndroidRuntime(2924):  at android.view.LayoutInflater.createView(LayoutInflater.java:594) 
08-08 14:50:21.251: E/AndroidRuntime(2924):  ... 24 more 
08-08 14:50:21.251: E/AndroidRuntime(2924): Caused by: java.lang.OutOfMemoryError 
08-08 14:50:21.251: E/AndroidRuntime(2924):  at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method) 
08-08 14:50:21.251: E/AndroidRuntime(2924):  at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:503) 
08-08 14:50:21.251: E/AndroidRuntime(2924):  at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:356) 
08-08 14:50:21.251: E/AndroidRuntime(2924):  at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:800) 
08-08 14:50:21.251: E/AndroidRuntime(2924):  at android.content.res.Resources.loadDrawable(Resources.java:2105) 
08-08 14:50:21.251: E/AndroidRuntime(2924):  at android.content.res.TypedArray.getDrawable(TypedArray.java:601) 
08-08 14:50:21.251: E/AndroidRuntime(2924):  at android.widget.ImageView.<init>(ImageView.java:127) 
08-08 14:50:21.251: E/AndroidRuntime(2924):  at android.widget.ImageView.<init>(ImageView.java:117) 
08-08 14:50:21.251: E/AndroidRuntime(2924):  ... 27 more 

Я не понимаю, как это уходит из памяти для такого небольшого размера.

Это мой макет XML для ImageView

<ImageView 
     android:id="@+id/imageView1" 
     android:layout_width="wrap_content" 
     android:layout_height="fill_parent" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentTop="true" 
     android:scaleType="center" 
     android:src="@drawable/back" /> 
+0

уменьшите изображение, используя соответствующие методы «Bitmap.decode». Http: //developer.android.com/training/displaying-bitmaps/load-bitmap.html – Raghunandan

+0

@Raghunandan Но я никогда не называю это в классе активности , Это просто часть контента. –

+0

Ваши взгляды занимают пространство в памяти. http://www.youtube.com/watch?v=_CruQY55HOk и это http://developer.android.com/training/displaying-bitmaps/manage-memory.html – Raghunandan

ответ

1

Внутри ваш .png представлен целым числом на пиксель (по умолчанию). Целое число - 4 байта. Если вы делаете математику:

2560 pixels * 1600 pixels * 4 bytes/pixel = 16,384,000 bytes = 15.625 MB 

Предел памяти для одного приложения на старых устройствах Android составляет 16 МБ. Формат Portable Network Graphics обычно сжимается, и именно поэтому существует четкое различие в размере его файла и размере для представления изображения в памяти. Кроме того, Android тратит байт на альфа-канал, даже если ваше изображение не имеет или не нуждается в альфа-канале.

+0

Хорошо, это имеет смысл. В таком случае, как я могу получить png для заполнения всего экрана, если я не могу использовать 2560 на 1600 png? –

+0

Вы должны посмотреть http://developer.android.com/training/displaying-bitmaps/load-bitmap.html. См. «Загрузка масштабированной вниз версии в память» – Samuel

+0

Также см. Раздел «BitmapFactory.Options.inSampleSize» http://developer.android.com/reference/android/graphics/BitmapFactory.Options.html – Samuel

1

Это 44k сжатый размер. Чтобы использовать его в качестве фона, он несжатый в растровое изображение. Размер памяти растрового изображения - это размер цветного формата для каждого пикселя, умноженный на ширину по высоте. Хуже того, если он масштабируется, системе потребуется больше памяти для масштабирования.

Так, например, если вы используете этот формат цвета: http://developer.android.com/reference/android/graphics/Bitmap.Config.html#RGB_565

Тогда объем память, необходимая для растрового изображения составляет 2 х 2560 х 1600 = 7,8125 MB.

Существует явная возможность для получения дополнительной памяти: http://developer.android.com/guide/topics/manifest/application-element.html#largeHeap

Хотя вы также должны убедиться в том, чтобы обеспечить меньшие ресурсы для более низких устройств DPI и читать только в столько данных, сколько вам нужно. Класс BitmapFactory позволяет пропускать пиксели при чтении данных, если вам не нужен каждый пиксель. BitmapRegionDecoder позволяет вам читать только те части изображения, которые вам нужны.

+1

использование большойHeap в большинстве случаев не требуется. Кроме того, больше кучи более частые коллекции одежды и более частые времена паузы – Raghunandan

1

Избегайте использования растровых изображений для заполнения фона. Они не будут давать наилучшие результаты и будут масштабироваться без сохранения коэффициента экрана.

Используйте 9 патчей, фигурные чертежи, простые цвета и/или небольшие растровые изображения, закрепленные на некотором углу.

Смежные вопросы