移动在我下面的教程来的Soundpool融入我的应用程序之前加载,这是在本教程中给出的代码:等待的Soundpool与应用
package com.example.soundpoolexample;
import android.app.Activity;
import android.media.AudioManager;
import android.media.SoundPool;
import android.media.SoundPool.OnLoadCompleteListener;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
public class SoundPoolExample extends Activity implements OnTouchListener {
private SoundPool soundPool;
private int soundID;
boolean loaded = false;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
View view = findViewById(R.id.textView1);
view.setOnTouchListener(this);
// Set the hardware buttons to control the music
this.setVolumeControlStream(AudioManager.STREAM_MUSIC);
// Load the sound
soundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);
soundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() {
@Override
public void onLoadComplete(SoundPool soundPool, int sampleId,
int status) {
loaded = true;
}
});
soundID = soundPool.load(this, R.raw.sound1, 1);
}
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
// Getting the user sound settings
AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
float actualVolume = (float) audioManager
.getStreamVolume(AudioManager.STREAM_MUSIC);
float maxVolume = (float) audioManager
.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
float volume = actualVolume/maxVolume;
// Is the sound loaded already?
if (loaded) {
soundPool.play(soundID, volume, volume, 1, 0, 1f);
Log.e("Test", "Played sound");
}
}
return false;
}
}
的问题是,我想以确保应用程序只在SoundPool加载成功后才前进,并且不必在每次播放声音之前检查它是否已加载。我将如何做到这一点?
我相信这是一个残暴的解决方案,但将这样的事情,下班后我加载的onCreate声音文件?:
...
soundID = soundPool.load(this, R.raw.sound1, 1);
while (!loaded) {}
...
我肯定有一个更好的办法。
谢谢,看着它。这是所有其他应用程序等待其资源加载的方式吗?我的意思是,当你打开任何应用程序,有一个加载屏幕。那么他们在后台运行信号量还是其他的东西? – capcom 2013-02-08 22:56:31
绝对有些应用程序正在使用'Semaphore'来做,你也可以用'wait/notify'来做到这一点,如果你想等待最长的时间,这是有帮助的。 – iTech 2013-02-08 22:59:51
当SoundPool(专为它设计)使用几种声音时,我相信CountDownLatch比Semaphore更好。 – personne3000 2014-07-13 07:30:55