1

我正在尝试使用 AsyncTask 在后台一个接一个地播放 5 个 SoundPool。但我想在声音运行时单击 ImageView。当 SoundPool 使用 getBaseContext() 在 doInBackground 运行时阻塞我的 ImageView 时,问题就开始了。有谁知道发生了什么?非常感谢!这是我的代码:

    public class SensoriomotoraActivity extends Activity {

    private boolean playing = false ;
    private ImageView image ;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.sensoriomotora);

        image = (ImageView) findViewById(R.id.img_sensoriomotora_pandereta);

        image.setOnClickListener(new View.OnClickListener() {

             @Override
         public void onClick(View v) {
           if (playing){
            Log.v("onClick","clicked while playing");   
           }
           else {
            Log.v("onClick","clicked while !playing");  
           }
         }
        });


        new Thread (
                new Runnable(){
                    @Override
                    public void run(){
                        // Waiting 2.5 secs before playing the beeps
                        try {
                            Thread.sleep(2500);
                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                         runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    new PlaySoundBackground().execute();
                                }
                         });
                    }
                }
          ).start(); 
   }


    private class PlaySoundBackground extends AsyncTask<Void, Void, Void>{

       @Override
       protected void onPreExecute() {
           playing = true ;
       }

       @Override
       protected Void doInBackground(Void... params) {

           SoundPool sound;

           sound = new SoundPool(1, AudioManager.STREAM_MUSIC,0);
           sound.load(getBaseContext(), R.raw.beep, 1);
           sound.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {

              @Override
              public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
                for (int i=0 ; i<5; i++){
                    soundPool.play(sampleId, 1, 1, 1, 0, 1);
                    try {
                        Thread.sleep(2000); // Waits 2 secs before next beep
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
              }
           });
           return null;
      }

      @Override
      protected void onPostExecute(Void result) {
           playing = false ;
      }       
  }
}
4

0 回答 0