java Android 应用程序中的 WaitingInMainSignalCatcherLoop 错误
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/29753117/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
WaitingInMainSignalCatcherLoop Error in Android Application
提问by WD40
I have an android application that refreshes the screen every 33 milliseconds, displaying a rectangle at a pair of coordinates. Here is the code for the custom view:
我有一个 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) {}
}
I used to have a separate thread that handled the drawing, but that 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 ]
采纳答案by fadden
That's not an error, that's the VM letting you know that your app was sent a signal 3 (SIGQUIT). The most likely cause is that the app was unresponsive and the system is doing ANR processing -- SIGQUIT causes the VM to dump a stack trace.
这不是错误,而是 VM 让您知道您的应用程序已发送信号 3 (SIGQUIT)。最可能的原因是应用程序没有响应并且系统正在执行 ANR 处理——SIGQUIT 导致 VM 转储堆栈跟踪。
Do you see ANR complaints in logcat?
您是否在 logcat 中看到 ANR 投诉?
Looking at your code, you're looping in surfaceCreated()
, which runs on the UI thread. That means your app won't be able to process messages from the system (or draw on Views, or receive user input). You can either use a separate thread as you did before (but with better synchronization), or just remove the loop from surfaceCreated()
and then have your draw handler re-issue postDelayed()
every time it executes.
查看您的代码,您正在循环surfaceCreated()
,它在 UI 线程上运行。这意味着您的应用程序将无法处理来自系统的消息(或绘制视图,或接收用户输入)。您可以像以前一样使用单独的线程(但具有更好的同步性),或者只是从中删除循环surfaceCreated()
,然后在postDelayed()
每次执行时重新发出绘制处理程序。