2012-07-02 2 views
6

Ich benutze AndEngine, um ein Spiel zu machen, das sich mit vielen beweglichen Sprites beschäftigt. Es ist unbeständig wenn, aber irgendwann bekomme ich eine Nachricht in der Log-Katze (threadid = 3: Reagieren auf Signal 3) und das Spiel friert ein. Was bedeutet dieser Fehler? Ich habe in den Code verengt, wo es passiert (es ist markiert):Warum bekomme ich: threadid = 3: Reaktion auf Signal 3 und Spielstopp (AndEngine)?

private void levelComplete(){ 
     runOnUiThread(new Runnable() { 
      public void run() { 
       Toast.makeText(TestGFX5Activity.this, "Level Complete", Toast.LENGTH_SHORT).show(); 
      } 
     }); 
     Log.e("Level Complete","Going to reset values"); 
     //Reset values 
     level++; 
     fillerCount = (originalNumberOfFillers + level - 1); 
     areaFilled=0; 
     fillAreaPercent = 0; 

     //Rid scene of sprites 
     for(int x=0;x<=fillerNum;x++){ 
      filler[x].body.setActive(false); 
      scene.detachChild(filler[x].sprite); 
      filler[x].active=false; 
      filler[x].scale=originalSpriteScale; 
      filler[x].body.setUserData("inactive"); 
     } 
     levelText.setText("Level: "+Integer.toString(level)); 
     fillersLeftText.setText("Balls left: "+Integer.toString(fillerCount)); 
     percentFilledText.setText("0%"); 
     fillerNum = -1; 

     Log.e("Level Complete","values reset"); 

     randx = random.nextInt(650) + 25; 
     randy = random.nextInt(400) + 25; 
     randix = random.nextInt(10); 
     randiy = random.nextInt(10); 
     if(randix%2==0) 
      ix = 5; 
     else 
      ix = -5; 
     if(randiy%2==0) 
      iy = 5; 
     else 
      iy = -5; 

     Log.e("Level Complete","Creating destroyer"); //This line executes 
     destroyer = new Ball(randx, randy, destroyerTR, getVertexBufferObjectManager(), ix, iy); //Code breaks here (*sometimes*) 
     Log.e("Level Complete","complete"); //This line does not 
    } 

Das Seltsamste ist, dass der Code wie 4/5 mal funktioniert (ich kann in der Regel Stufe nach oben 3 oder 4 Mal und bis zu 9 mal) bevor es abstürzt. Ich bin mir nicht sicher, was es verursacht. Hat jemand Ideen?

+0

Ich habe das gleiche Problem. Wie lösen Sie es? – Ricardo

Antwort

6

Wenn eine ANR-Bedingung auftritt, sendet die Android Runtime das Signal 3 an alle dalvik-VMs, damit diese ihre Stack-Traces ablegen, um den ANR-Bericht zu generieren. Der Speicherauszug von strack trace wird dazu führen, dass dalvik Ihre App vorübergehend aussetzt.

Ich empfehle Ihnen, auf die Logcat (Ereignis und Hauptpuffer) für ANRs zu schauen. Überprüfen Sie auch/data/anr für die ANR-Traces, um zu überprüfen, was das Problem verursacht.

1

Durch Überprüfen der Datei /data/anr/traces.txt können Sie feststellen, ob Dutzende von Threads vorhanden sind. Dies könnte der Grund sein, warum Ihre Anwendung eingefroren ist.