2012-01-22 16 views
6

Ho quasi finito il mio gioco ora, ma oggi ho riscontrato un vero problema di avventura. Quando inizio il gioco e aspetto solo alcuni secondi, il programma si spegne automaticamente. E non ho nessuna esplosione per questo.Qual è l'errore nel mio logcat?

Questo è ciò che il mio logcat mostra:

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. 

non ho purtroppo alcun codice di condividere, perché non so erano i crash del programma.

EDIT: codice di disegno:

@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)); 
} 

metodo 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

La perdita di memoria non è nel codice di disegno. Un probabile luogo da cercare è il codice [activity lifecycle] (http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle). I log sembrano indicare che stai usando un'architettura client/server; un altro potrebbe trovarsi nel tuo IPC o codice di rete. –

+0

Sei sicuro? Quando rimuovo il metodo drawText(), il programma ora si blocca. – Daniel

+2

Hmm. Prova a caricare il tuo carattere una volta all'avvio del programma anziché ogni volta che disegni il testo. –

risposta

10

Si ha una perdita di memoria da qualche parte. Vedere this blog post nei documenti dello sviluppatore per gli strumenti che è possibile utilizzare per rintracciare. Vedi anche this blog post per suggerimenti sulla programmazione per evitare perdite di memoria nelle applicazioni 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. 

Sembra che il tuo gioco usando due quantità di memoria (o) perdita di memoria. Potrebbe essere necessario registrare l'utilizzo della memoria del processo utilizzando alcune delle tecniche descritte nella discussione this e prendere da lì.

+0

Ma come può essere quando sto disegnando del testo e uno sfondo a un colore? Questo non dovrebbe richiedere molta memoria. Cosa dovrei fare? – Daniel

+2

@Daniel - se il tuo codice è semplice come descrivi, pubblicalo nella sua interezza e possiamo vedere dove potrebbe fuoriuscire. –

+0

L'ho fatto ora .. – Daniel

1

Con il debug a passo singolo, ho ricevuto l'errore di dettaglio: è necessario fornire attributo layout_height in .... Ha funzionato per la mia situazione.

Problemi correlati