调用SoundPool Thead onClick事件

时间:2014-04-30 10:42:39

标签: android multithreading onclick soundpool

我正在尝试在点击视图对象时播放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

提前致谢。

2 个答案:

答案 0 :(得分:0)

你不需要线程来发出没有​​滞后的声音。滞后来自声音文件的加载,尝试创建SoundPool并提前加载声音(soundPool.load)(例如onCreate),然后只需调用{{1}中的soundPool.play方法。

答案 1 :(得分:0)

好的,所以不是在另一个类中进行,我决定在一个类中完成它并自己创建一个新线程。似乎运作良好。

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