2012-01-22 3 views
6

Я почти закончил свою игру сейчас, но сегодня я столкнулся с настоящей проблемой анонимности. Когда я начинаю игру и просто жду несколько секунд, программа автоматически отключается. И я не хочу этого делать.Какая ошибка в моем логарифме?

Это то, что мой LogCat показывает:

01-22 16:20:31.232: DEBUG/szipinf(333): Initializing inflate state 
01-22 16:20:31.563: DEBUG/PhoneWindow(333): couldn't save which view has focus because the focused view [email protected] has no id. 
01-22 16:20:36.362: WARN/ActivityManager(73): Activity pause timeout for HistoryRecord{406532f8 com.JDL.Apps.Snake/.SnakeGame} 
01-22 16:20:43.682: INFO/ActivityManager(73): Start proc com.android.launcher for activity com.android.launcher/com.android.launcher2.Launcher: pid=358 uid=10026 gids={} 
01-22 16:21:20.393: ERROR/InputDispatcher(73): channel '406762c0 com.JDL.Apps.Snake/com.JDL.Apps.Snake.SnakeGame (server)' ~ Consumer closed input channel or an error occurred. events=0x8 
01-22 16:21:20.402: ERROR/InputDispatcher(73): channel '406762c0 com.JDL.Apps.Snake/com.JDL.Apps.Snake.SnakeGame (server)' ~ Channel is unrecoverably broken and will be disposed! 
01-22 16:21:21.092: INFO/WindowManager(73): WIN DEATH: Window{406762c0 com.JDL.Apps.Snake/com.JDL.Apps.Snake.SnakeGame paused=false} 
01-22 16:21:21.142: WARN/ActivityManager(73): Timeout of broadcast BroadcastRecord{40728640 android.intent.action.TIME_TICK} - [email protected]406300f8, started 56630ms ago 
01-22 16:21:21.142: WARN/ActivityManager(73): Receiver during timeout: BroadcastFilter{4062f930 ReceiverList{4062f8b8 73 system/1000 local:406300f8}} 
01-22 16:21:21.172: INFO/ActivityManager(73): Process com.JDL.Apps.Snake (pid 333) has died. 
01-22 16:21:21.362: INFO/WindowManager(73): WIN DEATH: Window{4072b188 SurfaceView paused=false} 
01-22 16:21:21.443: INFO/ActivityManager(73): Low Memory: No more background processes. 

У меня к сожалению нет кода, чтобы разделить, потому что я не знаю, были сбои программы.

EDIT: код рисования:

@Override 
public void screen(float deltaTime) { 
    Graphics g = app.getGraphics(); 

    g.drawPixmap(Assets.background, 0, 0); 

    g.drawPixmap(Assets.facebook, 750, 20); 

    g.drawText("SNAKE", 10, 150, Color.BLACK, 150, AndroidGraphics.LEFT, 
      null, 0); 
    g.drawText("START", g.getWidth()/2, g.getHeight() - 20, Color.BLACK, 
      120, AndroidGraphics.CENTER, startRec, 0); 
    g.drawText("HIGHSCORE", 20, 275, Color.BLACK, 50, AndroidGraphics.LEFT, 
      highRec, 0); 
    g.drawText("MORE APPS", g.getWidth() - 20, 275, Color.BLACK, 50, 
      AndroidGraphics.RIGHT, moreRec, 0); 
    if (Settings.soundEnabled) 
     g.drawPixmap(Assets.buttons, new Rect(0, 0, 100, 100), new Rect(0, 
       380, 100, 480)); 
    else 
     g.drawPixmap(Assets.buttons, new Rect(100, 0, 200, 100), new Rect(
       0, 380, 100, 480)); 
} 

метод DrawText:

@Override 
public void drawText(String text, int x, int y, int color, int size, 
     int position, Rect bounds, int rotation) { 
    if (position == LEFT) 
     paint.setTextAlign(Paint.Align.LEFT); 
    else if (position == CENTER) 
     paint.setTextAlign(Paint.Align.CENTER); 
    else if (position == RIGHT) 
     paint.setTextAlign(Paint.Align.RIGHT); 
    else 
     return; 
    paint.setColor(color); 
    Typeface typeface = Typeface.createFromAsset(assets, "typewrite.TTF"); 
    paint.setTypeface(typeface); 
    paint.setTextSize(size); 
    if (bounds != null) { 
     Rect rec = new Rect(); 
     paint.getTextBounds(text, 0, text.length(), rec); 
     bounds.bottom = y; 
     bounds.top = y - rec.height(); 
     if (position == CENTER) { 
      bounds.left = x - rec.width()/2; 
      bounds.right = x + rec.width()/2; 
     } else if (position == RIGHT) { 
      bounds.left = x - rec.width(); 
      bounds.right = x; 
     } else if (position == LEFT) { 
      bounds.left = x; 
      bounds.right = x + rec.width(); 
     } else 
      return; 
    } 
    canvas.save(); 
    canvas.rotate(rotation, x, y); 
    canvas.drawText(text, x, y, paint); 
    canvas.restore(); 
} 
+0

Утечка памяти отсутствует в вашем коде чертежа. Один из возможных мест для поиска - это ваш [жизненный цикл активности] (http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle). Журналы, похоже, указывают, что вы используете архитектуру клиент/сервер; другой может быть в вашем IPC или сетевом коде. –

+0

Неужели? Когда я удаляю метод drawText(), программа теперь сбой. – Daniel

+2

Хм. Попробуйте загрузить шрифт один раз, когда программа запускается, а не каждый раз, когда вы рисуете текст. –

ответ

10

У вас где-то есть утечка памяти. См. this blog post в документах разработчика для инструментов, которые вы можете использовать для отслеживания. Также см. this blog post для программирования советов, чтобы избежать утечки памяти в приложениях Android.

3
~ Channel is unrecoverably broken and will be disposed! 

01-22 16:21:21.443: INFO/ActivityManager(73): Low Memory: No more background processes. 

кажется ваша игра с помощью два много памяти (или) утечки памяти. Возможно, вам понадобится записать использование памяти вашего процесса, используя некоторые методы, описанные в обсуждении this, и оттуда оттуда.

+0

Но как это может быть, когда я просто рисую какой-то текст и одноцветный фон? Это не должно занимать много памяти. Что мне делать? – Daniel

+2

@ Daniel - если ваш код так же прост, как вы описываете, опубликуйте его целиком, и мы можем посмотреть, где он может протекать. –

+0

Я сделал это сейчас .. – Daniel

1

С помощью одноэтапной отладки у меня возникла ошибка детали: вы должны указать атрибут layout_height. Это действительно работало для моей ситуации.

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