Android-如何在不停止的情况下使TimerTask中的声音池静音
我试图创造一个节拍器的声音,但是,什么是不工作的能力,使它静音。我希望能够在不停止TimerTask的情况下将其静音,因为我希望在取消静音后速率保持一致。这是我的密码:Android-如何在不停止的情况下使TimerTask中的声音池静音,android,timer,timertask,soundpool,android-sound,Android,Timer,Timertask,Soundpool,Android Sound,我试图创造一个节拍器的声音,但是,什么是不工作的能力,使它静音。我希望能够在不停止TimerTask的情况下将其静音,因为我希望在取消静音后速率保持一致。这是我的密码: public class Metronome { private boolean mute; private boolean playing = false; private Timer mainTimer; private SoundPool mSoundPool; int mSound
public class Metronome {
private boolean mute;
private boolean playing = false;
private Timer mainTimer;
private SoundPool mSoundPool;
int mSoundID;
public Metronome(Context context) {
mSoundPool = new SoundPool(2, AudioManager.STREAM_MUSIC, 0);
mSoundID = mSoundPool.load(context, R.raw.metronome, 1);
}
public void play(float pace, boolean mute) {
mainTimer = new Timer();
MyTimerTask mainTimerTask = new MyTimerTask();
mainTimer.schedule(mainTimerTask, 0, Math.round(pace * 1000));
this.mute = mute;
playing = true;
}
public void stop() {
mainTimer.cancel();
mainTimer.purge();
playing = false;
}
public boolean isPlaying() {
return playing;
}
public void setMute(boolean mute) {
this.mute = mute;
if (mute) {
mSoundPool.setVolume(mSoundID, 0, 0);
} else {
mSoundPool.setVolume(mSoundID, 1, 1);
}
}
private void playSound() {
if (!mute) {
mSoundPool.play(mSoundID, 1, 1, 1, 0, 1);
}
}
class MyTimerTask extends TimerTask {
@Override
public void run() {
playSound();
}
}
}
但是,调用
setMute(true)
不起作用。有人知道我如何使声音池静音吗?找到了答案。当我使用静态方法和变量时,它就起作用了
public class Metronome {
public static boolean mute = false;
public static boolean playing = false;
private static Timer mainTimer;
private static SoundPool soundPool;
private static int soundID;
public static void loadSound(Context context) {
soundPool = new SoundPool(2, AudioManager.STREAM_MUSIC, 0);
soundID = soundPool.load(context, R.raw.metronome, 1);
}
public static void play(float pace, boolean isMuted) {
mainTimer = new Timer();
MyTimerTask mainTimerTask = new MyTimerTask();
mainTimer.schedule(mainTimerTask, 0, Math.round(pace * 1000));
mute = isMuted;
playing = true;
}
public static void stop() {
mainTimer.cancel();
mainTimer.purge();
playing = false;
}
static class MyTimerTask extends TimerTask {
@Override
public void run() {
playSound();
}
private void playSound() {
if (!mute) {
soundPool.play(soundID, 1, 1, 1, 0, 1);
}
}
}
}
我明白了。当我使用静态方法和变量时,它就起作用了
public class Metronome {
public static boolean mute = false;
public static boolean playing = false;
private static Timer mainTimer;
private static SoundPool soundPool;
private static int soundID;
public static void loadSound(Context context) {
soundPool = new SoundPool(2, AudioManager.STREAM_MUSIC, 0);
soundID = soundPool.load(context, R.raw.metronome, 1);
}
public static void play(float pace, boolean isMuted) {
mainTimer = new Timer();
MyTimerTask mainTimerTask = new MyTimerTask();
mainTimer.schedule(mainTimerTask, 0, Math.round(pace * 1000));
mute = isMuted;
playing = true;
}
public static void stop() {
mainTimer.cancel();
mainTimer.purge();
playing = false;
}
static class MyTimerTask extends TimerTask {
@Override
public void run() {
playSound();
}
private void playSound() {
if (!mute) {
soundPool.play(soundID, 1, 1, 1, 0, 1);
}
}
}
}
考虑到SoundPool的官方Android文档没有提到任何关于全球状态、单例或类似的内容,我相信真正的问题是在其他地方,将所有内容更改为静态只是碰巧解决了它。例如,在Metronome的另一个实例上调用setMute()而不是在播放声音的实例上调用setMute()。考虑到SoundPool的官方Android文档中没有提到任何全局状态、单例或类似情况,我相信真正的问题出在其他地方,将所有内容更改为静态正好解决了这个问题。例如,在与播放声音的Metronome实例不同的Metronome实例上调用setMute()。