代码之家  ›  专栏  ›  技术社区  ›  Pink Jazz

android-如何在timertask中禁用声音池而不停止它

  •  0
  • Pink Jazz  · 技术社区  · 6 年前

    我试图创造一个节拍器的声音,然而,什么是不起作用的能力,使其静音。我希望能够在不停止timertask的情况下将其静音,因为我希望取消静音后的速率保持一致。这是我的代码:

    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) 不起作用。有人知道我怎样才能使我的声音池静音吗?

    0 回复  |  直到 6 年前
        1
  •  0
  •   Pink Jazz    6 年前

    明白了。它在我使用静态方法和变量时工作。

    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);
                }
            }
        }
    }
    
    推荐文章