Error WaitingInMainSignalCatcherLoop in Android App

I have an Android app that updates the screen every 33 milliseconds, displaying a rectangle in a pair of coordinates. Here is the code for the custom view:

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 had a separate thread that processed the drawing, but this caused problems with variables having different values ​​between the threads. When I run this program, I get this error:

 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 ] 
+6
source share
1 answer

It is not an error that the VM will tell you that signal 3 (SIGQUIT) has been sent to your application. The most likely reason is that the application is not responding and the system is processing ANR - SIGQUIT forces the virtual machine to delete the stack trace.

Do you see ANR complaints in logcat?

surfaceCreated() looking at your code, you are looping over surfaceCreated() , which works in the user interface thread. This means that your application will not be able to process messages from the system (or draw on presentations or receive user input). You can either use a separate thread, as before (but with better synchronization), or simply remove the loop from surfaceCreated() , and then each time it postDelayed() , your paint handler re-issues postDelayed() .

+7
source

Source: https://habr.com/ru/post/985536/


All Articles