2013-03-05 2 views
1

Я сделал полноэкранное приложение для перехода по клику с 6 экранами. Приложение переходит с экрана по щелчку. Каждый экран имеет свою собственную активность (Step1, Step2, Step3 и т. Д. До этапа 6). Ничего сложного, макеты очень просты, только фоновое изображение и кнопка для нажатия. Я добираюсь до экрана 3, когда возникают проблемы, неожиданно следующий экран не появится, но приложение выйдет из строя из-за ошибки памяти. Я пробовал переходить на экраны 4, 5, 6, не повезло, но если я вернусь, чтобы сказать экран 2 с экрана 3, то он работает! Что-то утечка, но я не знаю, что. Фоновые изображения малы.Android Out of Memory at setContentView

меняется между процессами с этим кодом:

Intent myIntent = new Intent(Step3.this, Step6.class); 
Step3.this.startActivity(myIntent); 
System.gc(); 

Это журнал:

03-05 12:38:44.090: D/dalvikvm(22184): WAIT_FOR_CONCURRENT_GC blocked 0ms 
03-05 12:38:44.115: D/dalvikvm(22184): GC_EXPLICIT freed 3622K, 8% free 55598K/59911K, paused 1ms+3ms, total 22ms 
03-05 12:39:33.965: D/dalvikvm(22184): WAIT_FOR_CONCURRENT_GC blocked 0ms 
03-05 12:39:34.040: D/dalvikvm(22184): GC_EXPLICIT freed 31K, 8% free 55633K/59911K, paused 11ms+5ms, total 74ms 
03-05 12:39:34.040: I/Choreographer(22184): Skipped 2910 frames! The application may be doing too much work on its main thread. 
03-05 12:39:43.850: D/dalvikvm(22184): GC_FOR_ALLOC freed 34K, 8% free 55613K/59911K, paused 23ms, total 24ms 
03-05 12:39:43.860: I/dalvikvm-heap(22184): Grow heap (frag case) to 58.364MB for 3686416-byte allocation 
03-05 12:39:43.900: D/dalvikvm(22184): GC_CONCURRENT freed <1K, 7% free 59213K/63559K, paused 14ms+5ms, total 39ms 
03-05 12:39:43.935: D/dalvikvm(22184): GC_FOR_ALLOC freed 0K, 7% free 59213K/63559K, paused 18ms, total 18ms 
03-05 12:39:43.935: I/dalvikvm-heap(22184): Forcing collection of SoftReferences for 14745616-byte allocation 
03-05 12:39:43.955: D/dalvikvm(22184): GC_BEFORE_OOM freed <1K, 7% free 59213K/63559K, paused 18ms, total 19ms 
03-05 12:39:43.955: E/dalvikvm-heap(22184): Out of memory on a 14745616-byte allocation. 
03-05 12:39:43.955: I/dalvikvm(22184): "main" prio=5 tid=1 RUNNABLE 
03-05 12:39:43.955: I/dalvikvm(22184): | group="main" sCount=0 dsCount=0 obj=0x413f0508 self=0x413e0468 
03-05 12:39:43.955: I/dalvikvm(22184): | sysTid=22184 nice=0 sched=0/0 cgrp=apps handle=1074609968 
03-05 12:39:43.955: I/dalvikvm(22184): | schedstat=(1501533493 98715963 900) utm=116 stm=33 core=3 
03-05 12:39:43.955: I/dalvikvm(22184): at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method) 
03-05 12:39:43.955: I/dalvikvm(22184): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:623) 
03-05 12:39:43.955: I/dalvikvm(22184): at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:476) 
03-05 12:39:43.955: I/dalvikvm(22184): at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:781) 
03-05 12:39:43.955: I/dalvikvm(22184): at android.content.res.Resources.loadDrawable(Resources.java:1963) 
03-05 12:39:43.955: I/dalvikvm(22184): at android.content.res.TypedArray.getDrawable(TypedArray.java:601) 
03-05 12:39:43.955: I/dalvikvm(22184): at android.widget.ImageView.<init>(ImageView.java:120) 
03-05 12:39:43.960: I/dalvikvm(22184): at android.widget.ImageView.<init>(ImageView.java:110) 
03-05 12:39:43.960: I/dalvikvm(22184): at java.lang.reflect.Constructor.constructNative(Native Method) 
03-05 12:39:43.960: I/dalvikvm(22184): at java.lang.reflect.Constructor.newInstance(Constructor.java:417) 
03-05 12:39:43.960: I/dalvikvm(22184): at android.view.LayoutInflater.createView(LayoutInflater.java:587) 
03-05 12:39:43.960: I/dalvikvm(22184): at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56) 
03-05 12:39:43.960: I/dalvikvm(22184): at android.view.LayoutInflater.onCreateView(LayoutInflater.java:660) 
03-05 12:39:43.960: I/dalvikvm(22184): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:685) 
03-05 12:39:43.960: I/dalvikvm(22184): at android.view.LayoutInflater.rInflate(LayoutInflater.java:746) 
03-05 12:39:43.960: I/dalvikvm(22184): at android.view.LayoutInflater.inflate(LayoutInflater.java:489) 
03-05 12:39:43.960: I/dalvikvm(22184): at android.view.LayoutInflater.inflate(LayoutInflater.java:396) 
03-05 12:39:43.960: I/dalvikvm(22184): at android.view.LayoutInflater.inflate(LayoutInflater.java:352) 
03-05 12:39:43.960: I/dalvikvm(22184): at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:308) 
03-05 12:39:43.960: I/dalvikvm(22184): at android.app.Activity.setContentView(Activity.java:1924) 
03-05 12:39:43.960: I/dalvikvm(22184): at com.frogr4g.networktrial.Step6.onCreate(Step6.java:11) 
03-05 12:39:43.960: I/dalvikvm(22184): at android.app.Activity.performCreate(Activity.java:5206) 
03-05 12:39:43.960: I/dalvikvm(22184): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1083) 
03-05 12:39:43.960: I/dalvikvm(22184): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2064) 
03-05 12:39:43.960: I/dalvikvm(22184): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2125) 
03-05 12:39:43.960: I/dalvikvm(22184): at android.app.ActivityThread.access$600(ActivityThread.java:140) 
03-05 12:39:43.960: I/dalvikvm(22184): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1227) 
03-05 12:39:43.960: I/dalvikvm(22184): at android.os.Handler.dispatchMessage(Handler.java:99) 
03-05 12:39:43.960: I/dalvikvm(22184): at android.os.Looper.loop(Looper.java:137) 
03-05 12:39:43.960: I/dalvikvm(22184): at android.app.ActivityThread.main(ActivityThread.java:4898) 
03-05 12:39:43.960: I/dalvikvm(22184): at java.lang.reflect.Method.invokeNative(Native Method) 
03-05 12:39:43.960: I/dalvikvm(22184): at java.lang.reflect.Method.invoke(Method.java:511) 
03-05 12:39:43.960: I/dalvikvm(22184): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006) 
03-05 12:39:43.960: I/dalvikvm(22184): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773) 
03-05 12:39:43.960: I/dalvikvm(22184): at dalvik.system.NativeStart.main(Native Method) 
03-05 12:39:43.960: A/libc(22184): Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1), thread 22184 (4g.networktrial) 
03-05 12:39:57.150: D/dalvikvm(22766): GC_FOR_ALLOC freed 64K, 6% free 12115K/12867K, paused 34ms, total 35ms 
03-05 12:39:57.155: I/dalvikvm-heap(22766): Grow heap (frag case) to 15.883MB for 3686416-byte allocation 
03-05 12:39:57.170: D/dalvikvm(22766): GC_CONCURRENT freed <1K, 5% free 15714K/16519K, paused 3ms+1ms, total 14ms 

EDIT: Я создал подобное приложение из шести экранов, только с TextView и кнопками и цепь навигации (1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 1) без каких-либо изображений, и она работает как масло. (как и ожидалось). Так что это определенно связано с тем, что изображения занимают много памяти.

+0

Если вам не нужно возвращаться, вы всегда можете закончить текущую деятельность, прежде чем начинать новую. – Niko

+0

Используйте утилиту Memory Analyzer, чтобы узнать, где происходит утечка памяти. Трудно сказать, где проблема, не видя ваш код. – tundundun

+0

tundundun, придется заглянуть в это, спасибо за подсказку. Выглядит немного запугивающе. – Pompair

ответ

1

recycle() ваши Bitmaps как только вы покидаете деятельность, чтобы перейти к другой и реорганизовать код:

bitmap.recycle(); 
System.gc(); 
Intent myIntent = new Intent(Step3.this, Step6.class); 
Step3.this.startActivity(myIntent); 
+1

Спасибо, но я не использую растровые изображения, а изображения. – Pompair

2

несколько вещей, чтобы посмотреть.

  • Вы предоставили фоновое изображение (картинки) для нескольких плотностей? Масштабирование иногда потребляет много памяти.
  • Вы используете startActivity или startActivityForResult()? В последнем случае ваши старые объекты Activity не могут быть уничтожены.
  • Вы собираете информацию в классе Application?
+0

НЕТ Я не предоставил несколько плотностей. Я использую startActivity. Я не использую класс Application для хранения любых переменных, если это то, что вы имеете в виду. – Pompair

+0

@Pompair Каковы размеры ваших изображений и какой формат, и вы неявно запрашиваете их масштабирование? Даже относительно небольшой JPG будет потреблять довольно некоторую память, когда Android должен ее масштабировать. Предоставление изображений для разных плотностей может помочь избежать этого. –

+0

Класс Stacker, изображения 720x1280 32-бит pngs, около 20kB каждый. Я не знаю, какой неявный запрос для масштабирования означает ... Я использую настройки по умолчанию для просмотра изображений, растянутые в соответствии с размером активности. Какую папку я должен поместить изображения, если я хочу работать на Samsung S3? Является ли папка drawable-hdpi, где pngs должны идти ...? – Pompair