2015-04-20 8 views
6

Ich habe eine Android-Anwendung, die den Bildschirm alle 33 Millisekunden aktualisiert, ein Rechteck an einem Koordinatenpaar angezeigt. Hier ist der Code für die benutzerdefinierte Ansicht:WaitingInMainSignalCatcherLoop Fehler in der Android-Anwendung

import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.os.Handler; 
import android.util.AttributeSet; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 

public class OurView extends SurfaceView implements SurfaceHolder.Callback { 

    private SurfaceHolder holder; 
    private Handler handler = new Handler(); 
    private Bitmap testimg; 
    private int xCoord = 500; 
    private int yCoord = 500; 
    boolean running = false; 
    int xPos; 
    int yPos; 

    public OurView(Context context) { 
     super(context); 
     init(); 
    } 

    public OurView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init(); 
    } 

    public OurView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     init(); 
    } 

    private void init() { 
     holder = getHolder(); 
     holder.addCallback(this); 
     testimg = BitmapFactory.decodeResource(getResources(),R.drawable.testimg); 
    } 

    void moveImage(int xChange, int yChange) { 
     this.xCoord = this.xCoord + xChange; 
     this.yCoord = this.yCoord + yChange; 
    } 

    void doDraw(Canvas canvas) { 
     xPos = this.xCoord + (testimg.getWidth()/2); 
     yPos = this.yCoord + (testimg.getHeight()/2); 
     canvas.drawARGB(255, 55, 255, 255); 
     canvas.drawBitmap(testimg, xPos, yPos, null); 
    } 

    @Override 
    public void surfaceCreated(final SurfaceHolder holder) { 
     running = true; 
     while(running){ 

      handler.postDelayed(new Runnable() { 
       public void run() { 

        Canvas canvas = getHolder().lockCanvas(); 

        if(canvas != null){ 
         synchronized (getHolder()) { 
          doDraw(canvas); 
         } 
         holder.unlockCanvasAndPost(canvas); 
        } 

       } 
      }, 33); 

     } 
    } 

    @Override 
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {} 


    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) {} 

} 

I verwendet einen separaten Thread zu haben, die die Zeichnung behandelt, aber das verursacht Probleme mit Variablen unterschiedliche Werte zwischen den Fäden aufweist. Als ich dieses Programm ausführen, bekomme ich diesen Fehler:

04-20 10:54:35.577 1925-1931/com.thatoneprogrammerkid.gameminimum I/art﹕ Thread[2,tid=1931,WaitingInMainSignalCatcherLoop,Thread*=0xae668400,peer=0x12c00080,"Signal Catcher"]: reacting to signal 3 
04-20 10:54:35.577 1925-1931/com.thatoneprogrammerkid.gameminimum I/art﹕ [ 04-20 10:54:35.627 1925: 1931 W/art  ] 

Antwort

6

Das ist kein Fehler, das ist die VM so dass Sie wissen, dass Ihre App ein Signal 3 (SIGQUIT) gesendet wurden. Die wahrscheinlichste Ursache ist, dass die Anwendung nicht mehr reagiert hat und das System eine ANR-Verarbeitung durchführt. SIGQUIT bewirkt, dass die VM eine Stack-Ablaufverfolgung ausgibt.

Sehen Sie ANR Beschwerden in logcat?

Wenn Sie Ihren Code betrachten, durchlaufen Sie eine Schleife in surfaceCreated(), die auf dem UI-Thread ausgeführt wird. Das bedeutet, dass Ihre App keine Nachrichten vom System verarbeiten kann (oder Ansichten anzeigen oder Benutzereingaben erhalten kann). Sie können entweder einen separaten Thread wie zuvor (aber mit besserer Synchronisation) verwenden, oder Sie können die Schleife einfach von surfaceCreated() entfernen und dann lassen Sie Ihren Zeichenhandler bei jeder Ausführung postDelayed() erneut ausgeben.

+0

weiß jemand, wie man das löst, auch ich bekomme den gleichen Fehler –

+0

@AkshayShah Es könnte auch möglich sein, Sie haben eine Endlosschleife erstellt –