スレッドを一時停止すると 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 を (単なるクラスではなく) サービスにするポイントは何ですか?