Android 调用声音池Thead onclick事件

Android 调用声音池Thead onclick事件,android,multithreading,onclick,soundpool,Android,Multithreading,Onclick,Soundpool,我正在尝试在单击视图对象时播放声音池 我已经成功地实现了它,但是发现点击的声音会延迟 我一直在研究StackOverFlow和internet上的解决方案,最好的解决方案似乎是将声音池放在一个单独的线程上 我对整个线程的事情都很陌生,所以我现在真的不知道该做什么 我已经按照指南创建了一个声音池线程,但是,我不知道如何访问它,甚至不知道如何分配我想要播放的剪辑 有人可以给我一个例子,我应该如何调用SoundPool线程来播放我的剪辑,而视图中的对象正在被单击 请在下面找到我的onClick代码:

我正在尝试在单击视图对象时播放声音池

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

我一直在研究StackOverFlow和internet上的解决方案,最好的解决方案似乎是将声音池放在一个单独的线程上

我对整个线程的事情都很陌生,所以我现在真的不知道该做什么

我已经按照指南创建了一个声音池线程,但是,我不知道如何访问它,甚至不知道如何分配我想要播放的剪辑

有人可以给我一个例子,我应该如何调用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
@覆盖
公共布尔onTouch(视图v,运动事件){
int actionPerformed=event.getAction();
开关(已执行操作){
case MotionEvent.ACTION\u DOWN:{
if(Math.pow((event.getX()-a_Ball.getX()),2)
+Math.pow((event.getY()-a_Ball.getY()),2)

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

好的,所以我决定不在另一个类中执行此操作,而是在一个类中执行此操作,并自己创建了一个新线程。似乎工作得足够好


我会将此线程标记为答案。

感谢您的回复nicolas。我已将声音池的创建和加载移动到我的onCreate部分,并调用我的方法,但是,它仍然存在延迟…我使用的唯一临时解决方案是让它在静音状态下连续循环。我将尝试看看是否有其他解决方案。而不是ks再次回复这很奇怪,我在onTouch侦听器中使用SoundPool.play方法,没有任何延迟。我将0作为SoundPool构造函数的最后一个参数,尽管文档中说它没有效果。我还将SoundPool设置为并行播放多个声音(第一个参数,设置为6),因为我会播放几个声音。当一个声音还没有结束,下一个声音开始播放时,这也会有帮助。我知道,这是一些非常好的信息。我一定会尝试一下。但是有些人似乎和我有同样的问题,通过将其放入线程似乎可以完美地解决问题(目前).我会进一步调查的.再次感谢你的帮助