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()方法.这不是一个优雅的解决方案,但它会起作用.
这个错误似乎与月球着陆器错误有关,这是非常有名的(在谷歌上搜索一下)。过了这么久,又发布了几个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)
| 归档时间: |
|
| 查看次数: |
38805 次 |
| 最近记录: |