android的SurfaceView中多线程处理

本文探讨了使用SurfaceView循环显示多个图片时遇到的问题,包括点击Home按钮后再次运行程序时出现的ThreadAlreadyStarted异常及解决方案。分析了Home键与Back键在Android中的不同行为及其对Activity状态的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题外话,发现用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就可以了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值