如何暂停和恢复surfaceView线程

jfi*_*isk 14 multithreading android surfaceview

我有一个surfaceView设置并运行,但当我恢复它时,我得到一个错误,该线程已经启动.当应用程序进入后台然后返回前台时,处理的正确方法是什么?我已经修好了并且设法让应用程序无法崩溃而返回......但是SurfaceView不再绘制任何东西了.我的代码:

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
           Log.e("sys","surfaceCreated was called.");
           if(systemState==BACKGROUND){
                  thread.setRunning(true);

           }
           else {
        thread.setRunning(true);
               thread.start();
               Log.e("sys","started thread");
               systemState=READY;
           }



    }
    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
           Log.e("sys","surfaceDestroyed was called.");
           thread.setRunning(false);
           systemState=BACKGROUND;
    }
Run Code Online (Sandbox Code Playgroud)

Mic*_* A. 11

简单的解决方案是简单地杀死并重新启动线程.创建方法resume() - 创建线程对象并启动它 - 并暂停() - 杀死线程(请参阅Lunarlander示例) - 在SurfaceView类中并从surfaceCreated和surfaceDestroyed调用这些来启动和停止线程.

现在在运行SurfaceView的Activity中,您还需要从Activity(或片段)onResume()和onPause()调用SurfaceView中的resume()和pause()方法.这不是一个优雅的解决方案,但它会起作用.


And*_*der 5

这个错误似乎与月球着陆器错误有关,这是非常有名的(在谷歌上搜索一下)。过了这么久,又发布了几个android版本,这个bug依然存在,没有人费心去更新。我发现这可以处理最少的代码混乱:

  public void surfaceCreated(SurfaceHolder holder) {     
          if (thread.getState==Thread.State.TERMINATED) { 
               thread = new MainThread(getHolder(),this);
          }
          thread.setRunning(true);
          thread.start();
  }
Run Code Online (Sandbox Code Playgroud)