欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

android的SurfaceView中多线程处理

程序员文章站 2024-01-14 13:36:34
...
题外话,发现用MediaPlayer播放一个mp3文件,在播放结束后,出现了以下异常
MP3Extractor Unable to resync Signalling end of stream,有知道的朋友告知一下为什么
用SurfaceView作了一个简单的东西,开个线程,循环显示多个图片,发现在点击Home按钮之后,再次运行这个程序的时候,报 Thread already started异常。
而surfaceDestroyed方法中,对同步标志也作了处理,开始怀疑是否Home按钮不触发surfaceDestroyed方法,结果Log之后,发现也触发了。

public void surfaceDestroyed(SurfaceHolder holder) {
if(animThread.isAlive())
{
run = false;
}
}

上网google了半天,发现国外一个网站上说是android的bug,有个很挫的解决方式:

public void surfaceCreated(SurfaceHolder holder) {
//当用户点击了Home按钮时,线程实际上没有停止,这里如果没有Try会有异常,但这个处理不完美,暂时没有更好的处理
if(!animThread.isAlive())
{
try
{
animThread.start();
}
catch(IllegalThreadStateException itse)
{
animThread.resume();
}
}
}


其实,这个问题的根本原因在于Home键和Back键的区别,以下是一个引用网友的文章
android的手机的back键默认行为是finish处于前台的Activity的即Activity的状态为Destroy状态,再次启动该Activity是从onCreate开始的。

而Home键默认是stop前台的Activity即状态为onStop而不是Destroy,若再次启动它,则是从OnResume开始的,即会保持上次Activityd的状态。

back键也有例外的,按back键不会关闭Activity的,比如播放音乐,按了back键之后仍可以继续播放音乐,这是Music这支ap已经重写了back键的事件处理。

所以,我的这个处理就变得很简单,在onResume中重新调用加载该View就可以了