java - Android 应用程序中的 WaitingInMainSignalCatcherLoop 错误

标签 java android surfaceview

我有一个 android 应用程序,它每 33 毫秒刷新一次屏幕,在一对坐标处显示一个矩形。这是自定义 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) {}

}

我曾经有一个单独的线程来处理绘图,但这导致了线程之间具有不同值的变量的问题。当我运行这个程序时,我得到这个错误:

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 线程上运行。这意味着您的应用程序将无法处理来自系统的消息(或绘制 View ,或接收用户输入)。您可以像以前一样使用单独的线程(但同步性更好),或者只是从 surfaceCreated() 中删除循环,然后让您的绘图处理程序重新发出 postDelayed() 每次执行。

关于java - Android 应用程序中的 WaitingInMainSignalCatcherLoop 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29753117/

相关文章:

android - 应用程序传递了 NULL 表面,同时在没有表面 View 的情况下拍照

android - 添加自定义 View 作为 XML 布局的 View

java - 记录集没有返回任何值

java - OOP Design : Is it OK to place uncommon method in parent class, 如果大多数子类都有它?

javascript - 使用 PanResponder 的 React-Native 捏合缩放

android - 下载管理器有时显示不成功

java - 如何在 Netbeans 创建的 Java ME 应用程序中缩放启动屏幕图像

java - UnmarshalException 和 ClassNotFoundException : what am I doing wrong?

java - 在android中使用listview时分页

android - SurfaceView调用期的OnDraw