【问题标题】:Calling a SoundPool Thead onClickEvent调用 SoundPool 线程 onClick 事件
【发布时间】:2014-04-30 10:42:39
【问题描述】:

我正在尝试在单击视图对象时播放 SoundPool。

我已经成功实现了,但是发现点击的声音会有延迟。

我一直在研究 StackOverFlow 和互联网上的解决方案,最好的解决方案似乎是将 SoundPool 放在单独的线程上。

我对整个 Thread 事情很陌生,所以我现在真的不知道该怎么做。

我已按照THIS 指南创建 SoundPool 线程,但是,我不知道如何访问它,甚至不知道如何分配我希望播放的剪辑。

谁能给我一个示例,说明在单击视图中的对象时我应该如何调用 SoundPool 线程来播放我的剪辑。

请在下面找到我的 onClick 代码:

@Override
public boolean onTouch(View v, MotionEvent event) {
    int actionPerformed = event.getAction();

    switch(actionPerformed) {
        case MotionEvent.ACTION_DOWN: {
            if (Math.pow((event.getX() - a_Ball.getX()),2)
                + Math.pow((event.getY() - a_Ball.getY()), 2)
                <= Math.pow(a_Ball.getDiameter(),2)) {
                //pCheck = !pCheck;
                if (pauseBall == false) {
                    SoundPool soundPool = new SoundPool(1,AudioManager.STREAM_MUSIC,1);
                    clickSound = soundPool.load(MainActivity.this, R.raw.click, 1);
                    /*soundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() {
                        public void onLoadComplete(SoundPool soundPool, int sampleId,int status) {
                            soundPool.play(clickSound,1.0f, 1.0f, 0, 0, 1.0f);
                            }
                    });*/


                    //Increase Ball Speed
                    sIncrease = true;
                }
            } else {
                if (pauseBall == false) {
                    //set minus health when not touch on ball
                    health--;
                    TextView txtHealth = (TextView)findViewById(R.id.health);
                    String tempHealth = txtHealth.getText().toString();
                    tempHealth =  getResources().getString(R.string.health) + String.valueOf(health);
                    txtHealth.setText(tempHealth);
                }
            }
            break;
        }
        default:
            return false;
    }
    return true;
}   //onTouch end

提前致谢。

【问题讨论】:

    标签: android multithreading onclick soundpool


    【解决方案1】:

    您不需要线程就可以毫无延迟地发出声音。延迟来自声音文件的加载,尝试创建 SoundPool 并提前加载声音(soundPool.load)(例如onCreate),然后在您的onTouch 方法中调用soundPool.play

    【讨论】:

    • 感谢您的回复尼古拉斯。我已将 soundPool 的创建和加载移动到我的 onCreate 部分并在我的方法中调用,但是,它仍然有滞后......我正在使用的唯一临时解决方案是让它在静音状态下连续循环。我会尝试看看是否有任何其他解决方案。再次感谢您的回复
    • 这很奇怪,我在 onTouch 监听器中使用 SoundPool.play 方法没有任何延迟。我有 0 作为 SoundPool 构造函数的最后一个参数,尽管文档说它没有效果。我还设置了我的 SoundPool 以并行播放多个声音(第一个参数,设置为 6),因为我确实播放了几个声音。当一个声音未完成而下一个声音开始时,这也很有帮助。
    • 我明白了,这是一些非常好的信息。我一定会试一试的。但是有些人似乎和我有同样的问题,通过把它放在一个线程中似乎可以完美地解决问题(目前)。我会再做一些调查。再次感谢您的帮助
    【解决方案2】:

    好的,所以我决定在一个班级中进行,而不是在另一个班级中进行,并自己创建了一个新线程。似乎运行良好。

    我会将此主题标记为答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-09
      • 2015-06-05
      • 1970-01-01
      • 2014-10-15
      相关资源
      最近更新 更多