首页 > 解决方案 > Android Java App 在最小化/制表时兑现

问题描述

每次我最小化我的应用程序时,它都会立即崩溃。错误如下:stackoverflow 还要求我添加的不仅仅是代码,所以这里有一些文本。此外,stackoverflow 要求我添加的不仅仅是代码,所以这里有一些文本。此外,stackoverflow 要求我添加的不仅仅是代码,所以这里有一些文本。此外,stackoverflow 要求我添加的不仅仅是代码,所以这里有一些文本。此外,stackoverflow 要求我添加的不仅仅是代码,所以这里有一些文本。此外,stackoverflow 要求我添加的不仅仅是代码,所以这里有一些文本。

2021-03-19 22:12:11.243 6919-7009/com.example.zawarudo E/AndroidRuntime: FATAL EXCEPTION: Thread-2
    Process: com.example.zawarudo, PID: 6919
    java.lang.IllegalStateException: No recording in progress, forgot to call #beginRecording()?
        at android.graphics.RenderNode.endRecording(RenderNode.java:404)
        at android.view.Surface$HwuiContext.unlockAndPost(Surface.java:1029)
        at android.view.Surface.unlockCanvasAndPost(Surface.java:418)
        at android.view.SurfaceView$2.unlockCanvasAndPost(SurfaceView.java:1567)
        at com.example.zawarudo.GameLoopThread.run(GameLoopThread.java:53)

我的线程逻辑中有错误吗?

public class GameLoopThread extends Thread {
    private GameView view;
    private boolean running = false;

    public GameLoopThread(GameView view){

        this.view = view;
    }
    public void setRunning(boolean run){
        running = run;
    }
    
    @Override
    public void run(){
            Canvas c = null;
    
            while (running){
    
                try {
                    currentThread().sleep(17);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
    
                try{
                    view.getHolder().setFixedSize(1080,1920);
                    c = view.getHolder().lockHardwareCanvas();
                                     
                    c.rotate(90);
                    synchronized (view.getHolder()){
                        view.onDraw(c);
                    }
                } finally {
                    {
    
        view.getHolder().unlockCanvasAndPost(c);
    
                            }
                        }
                    }
                }
            }




gameThread = new GameLoopThread(this);
            holder = getHolder();
            holder.addCallback(new SurfaceHolder.Callback() {
 
                @Override
                public void surfaceCreated(SurfaceHolder surfaceHolder) {
                    gameThread.setRunning(true);
                    gameThread.start();
                }
    
                @Override
                public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    
                }
    
                public void surfaceChanged(SurfaceHolder holder) {
    
                }
    
    
                @Override
                public void surfaceDestroyed(SurfaceHolder holder) {
                    boolean retry = true;
                    gameThread.setRunning(false);
                    while (retry) {
                        try {
                            gameThread.join();
                            retry = false;
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }





public class GameView extends SurfaceView implements zaInterface {

    public GameMap tileMap = new GameMap();
    private SurfaceHolder holder;
    private GameLoopThread gameThread;

    public GameView(Context context) {
        super(context);

        screenheight = Resources.getSystem().getDisplayMetrics().heightPixels;;
        screenwidth = Resources.getSystem().getDisplayMetrics().widthPixels;

    
        gameThread = new GameLoopThread(this);
        holder = getHolder();
        holder.addCallback(new SurfaceHolder.Callback() {

            @Override
            public void surfaceCreated(SurfaceHolder surfaceHolder) {
                if (hasStarted==false) {
                    gameThread.setRunning(true);
                    gameThread.start();
                    hasStarted=true;
                }
                else{

                }
            }



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

            }

            public void surfaceChanged(SurfaceHolder holder) {

            }



            @Override
            public void surfaceDestroyed(SurfaceHolder holder) {
                /*
                boolean retry = true;
                gameThread.setRunning(false);
                while (retry) {
                    try {
                        gameThread.join();
                        retry = false;
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }

                 */
            }
        });
    }

这是我的游戏活动课

public class GameActivity extends AppCompatActivity {

    private GameView GameView;


    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        getWindow().isActive();
        GameMap.initialize();
        GameView.initialize();
        setContentView(new GameView(this));
    }
}

标签: javaandroidcanvascrashgame-loop

解决方案


尝试SurfaceView在活动暂停时停止。使用stopView()

@Override
protected void onPause() {
    super.onPause();
    if (gameThread != null)
        gameThread.setRunning(false);
}

推荐阅读