论坛首页 移动开发技术论坛

android的SurfaceView中多线程处理

浏览 6611 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-12-29   最后修改:2010-12-29
题外话,发现用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就可以了
   发表时间:2011-02-14  
音乐播放器好像是因为它的Service没有被停止,才会播放的;不是纯粹的Activity。
0 请登录后投票
   发表时间:2011-02-19  
音乐播放的功能是要放在Service中进行处理的。
0 请登录后投票
论坛首页 移动开发技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics