2012-01-22 12 views
6

Ya casi termino con mi juego, pero hoy me encontré con un verdadero problema molesto. Cuando comienzo el juego y simplemente espero unos pocos segundos, el programa se apaga automáticamente. Y no tengo ninguna explicación para eso.¿Cuál es el error en mi logcat?

Esto es lo que muestra mi 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. 

tengo por desgracia no hay código para compartir porque no sé fueron los errores en el programa.

EDIT: código de dibujo:

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

método 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 pérdida de memoria no está en su código de dibujo. Un lugar probable para buscar es en su código [activity life cycle] (http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle). Los registros parecen indicar que está utilizando una arquitectura cliente/servidor; otro puede estar en su IPC o código de red. –

+0

¿Estás seguro? Cuando elimino el método drawText(), el programa ahora falla. – Daniel

+2

Hmm. Intente cargar su fuente una vez cuando se inicie el programa en lugar de cada vez que dibuje texto. –

Respuesta

10

Tiene una pérdida de memoria en alguna parte. Consulte this blog post en los documentos de desarrollador para ver las herramientas que puede usar para rastrearlo. También vea this blog post para consejos de programación para evitar pérdidas de memoria en aplicaciones de 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. 

Parece que su juego usando dos la cantidad de memoria (o) pérdida de memoria. Es posible que necesite registrar el uso de memoria de su proceso utilizando algunas de las técnicas descritas en el debate this y tomar desde allí.

+0

¿Pero cómo puede ser eso cuando estoy dibujando texto y un fondo de un solo color? Eso no debería ocupar mucha memoria. ¿Qué debo hacer? – Daniel

+2

@Daniel: si su código es tan simple como usted lo describe, publíquelo en su totalidad y podremos ver dónde podría estar goteando. –

+0

Lo he hecho ahora .. – Daniel

1

Con la depuración de un solo paso, recibí el error de detalle: debe proporcionar el atributo layout_height en .... Funcionó para mi situación.

Cuestiones relacionadas