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 に答える