【问题标题】:Android Java App cashes when minimizing/tabing out最小化/选项卡时Android Java App崩溃
【发布时间】:2021-03-19 21:13:46
【问题描述】:

每次我最小化我的应用程序时,它都会立即崩溃。 错误如下: 此外,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));
    }
}

【问题讨论】:

    标签: java android canvas crash game-loop


    【解决方案1】:

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

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

    【讨论】:

    • 我不确定如何实现这一点,如果我尝试将它添加到给定代码中的其他 @Overrides 中,我会收到错误“方法不会覆盖其超类中的方法”。我将如何触发 StopView/获取暂停事件的通知?
    • @FiveJungYetNoSmite 你能显示更多代码吗.. 具体来说你如何定义view 对象
    • 我扩展了我的帖子。所有相关部分都应该在那里。我目前尝试编辑surfaceCreated 方法并清空surfacedestroyed 方法,这样它在标签出来时不会停止应用程序,但这似乎也不起作用。感谢您尝试帮助我,我很感激
    • 另外,如果您对游戏的外观感兴趣,请点击这里:old.reddit.com/r/UI_Design/comments/lyflbx/…
    • 我现在发现我必须放置 @Override public void onPause() { super.onPause();游戏视图.stop();进入 GameActivity 类,但我得到一个空对象引用错误。嗯。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-13
    • 2020-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多