我知道暂停线程很容易锁定 UI,这通常是个坏主意。但是,我的理解是,如果某些东西作为服务运行不会导致任何问题,因为该服务将暂停并且主应用程序将继续运行。
考虑到这一点,我要么做错了什么,要么只是误解了对 MediaPlayer 服务的使用。
我创建对象
public AudioService AudioService;
public boolean AudioServiceBound = false;
然后在我的 SurfaceView 的 onStart 事件中绑定它:
public void onStart() {
Intent intent = new Intent(gameContext, AudioService.class);
gameContext.bindService(intent, myConnection, Context.BIND_AUTO_CREATE);
}
在整个课程的其余部分,我运行基于 onResume 和 onPause 事件暂停和恢复 AudioService 的方法。
我试图为我的服务引入一种新能力。在我的主更新循环中,我运行HalfOverSwitch()
如下所示的函数:
public void HalfOverSwitch()
{
if (( ((float)player.getCurrentPosition()) / ((float)player.getDuration()) > 0.5) && !transitioning)
{
transitioning = true;
MediaPlayer temp = MediaPlayer.create(this, R.raw.dumped);
temp.setVolume(0, 0);
temp.setLooping(true);
temp.start();
for (int i = 0; i < 100; i++)
{
player.setVolume(100-i, 100-i);
temp.setVolume(i, i);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
player = temp;
player.setVolume(100,100);
transitioning = false;
}
}
因为该函数不返回任何内容并且在不同的线程中运行,所以我的理解是主要活动不会暂停。然而确实如此。这就提出了一个问题,做这样的事情的最好方法是什么,让我的 AudioService 成为一个服务(而不仅仅是一个类)有什么意义呢?