Android 应用程序中的 WaitingInMainSignalCatcherLoop 错误
WaitingInMainSignalCatcherLoop Error in Android Application
我有一个 android 应用程序,它每 33 毫秒刷新一次屏幕,在一对坐标处显示一个矩形。这是自定义视图的代码:
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) {}
}
我曾经有一个单独的线程来处理绘图,但这导致了线程之间具有不同值的变量的问题。当我 运行 这个程序时,我得到这个错误:
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 ]
这不是错误,那是虚拟机让您知道您的应用已发送信号 3 (SIGQUIT)。最可能的原因是应用程序没有响应并且系统正在进行 ANR 处理 -- SIGQUIT 导致 VM 转储堆栈跟踪。
您在 logcat 中看到 ANR 投诉了吗?
查看您的代码,您在 surfaceCreated()
中循环,它在 UI 线程上运行。这意味着您的应用程序将无法处理来自系统的消息(或绘制视图,或接收用户输入)。您可以像以前一样使用单独的线程(但同步性更好),或者只是从 surfaceCreated()
中删除循环,然后让绘制处理程序在每次执行时重新发出 postDelayed()
。
我有一个 android 应用程序,它每 33 毫秒刷新一次屏幕,在一对坐标处显示一个矩形。这是自定义视图的代码:
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) {}
}
我曾经有一个单独的线程来处理绘图,但这导致了线程之间具有不同值的变量的问题。当我 运行 这个程序时,我得到这个错误:
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 ]
这不是错误,那是虚拟机让您知道您的应用已发送信号 3 (SIGQUIT)。最可能的原因是应用程序没有响应并且系统正在进行 ANR 处理 -- SIGQUIT 导致 VM 转储堆栈跟踪。
您在 logcat 中看到 ANR 投诉了吗?
查看您的代码,您在 surfaceCreated()
中循环,它在 UI 线程上运行。这意味着您的应用程序将无法处理来自系统的消息(或绘制视图,或接收用户输入)。您可以像以前一样使用单独的线程(但同步性更好),或者只是从 surfaceCreated()
中删除循环,然后让绘制处理程序在每次执行时重新发出 postDelayed()
。