0

我知道暂停线程很容易锁定 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 成为一个服务(而不仅仅是一个类)有什么意义呢?

4

1 回答 1

1

服务在创建服务的同一线程中运行。

http://developer.android.com/reference/android/app/Service.html

“请注意,服务与其他应用程序对象一样,在其托管进程的主线程中运行。这意味着,如果您的服务要执行任何 CPU 密集型(例如 MP3 播放)或阻塞(例如网络)操作,它应该产生自己的线程来完成这项工作。”

于 2012-07-24T18:36:15.350 回答