2010-07-08 132 views
8

现在我有两个按钮。每个人都需要产生不同的声音。未来,可能会有大约8个按钮,但现在只有两个按钮。单击按钮时播放声音的最有效方式

public class MyActivity extends Activity { 
    public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 

      final Button btnDrum1 = (Button) findViewById(R.id.btnDrum1); 
      btnDrum1.setOnClickListener(new OnClickListener() { 
       public void onClick(View v) { 
        MediaPlayer mp = MediaPlayer.create(this, R.raw.drum1); 
         mp.start(); 
         mp.release(); 
       } 
      }); 

      final Button btnCym1 = (Button) findViewById(R.id.btnCym1); 
      btnCym1.setOnClickListener(new OnClickListener() { 
       public void onClick(View v) { 
        MediaPlayer mp = MediaPlayer.create(this, R.raw.cym1); 
          mp.start(); 
          mp.release(); 
       } 
      }); 

     } 
    } 

最初我没有mp.release(),它会正常播放声音,但最终应用程序会因内存不足而崩溃。现在使用mp.release()它不会崩溃,但有时点击时它不会播放声音。

这是点击按钮时播放声音的最有效方式吗?它是可扩展的吗?

回答

5

我认为这是由于你在播放时释放它。为每个声音制作一个全球MediaPlayer,然后重复使用它,在活动关闭时释放(甚至可能在暂停时释放,如果声音文件很大,则在恢复时重新加载)。此外,由于你将有许多按钮,你可以对你实例化的onCreate()所有按钮的单个onclicklistener:

private class MyMagicalOnClickListener implements View.OnClickListener { 
    @Override 
    public void onClick(View v) { 
     switch(v.getId()) { 
      case R.id.button1: 
      //play sound 1 
      break; 
     case R.id.button2: 
      //play sound 2 
      break; 
     } 
    } 
} 

只是发表意见,并告诉我,如果你是如何实现这一:)

不确定

编辑:每个请求,这里是一个整洁的实现应该与您的应用程序奇迹。我做到了,所以这个活动实现onclicklistener,我认为它更清洁一点。

public class Bluarg extends Activity implements OnClickListener{ 

    MediaPlayer mp1; 
    MediaPlayer mp2; 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     mp1 = MediaPlayer.create(this, R.raw.sound1); 
     mp2 = MediaPlayer.create(this, R.raw.sound2); 

     final Button button1 = (Button) findViewById(R.id.button1); 
     button1.setOnClickListener(this); 

     final Button button2 = (Button) findViewById(R.id.button2); 
     button1.setOnClickListener(this); 

    } 

    @Override 
    public void onClick(View v) { 
     switch(v.getId()) { 
     case R.id.button1: 
      mp1.start(); 
      break; 
     case R.id.button2: 
      mp2.start(); 
      break; 
     } 
    } 

    @Override 
    protected void onDestroy() { 
     mp1.release(); 
     mp2.release(); 
     super.onDestroy(); 
    } 
} 
+0

你所描述的似乎有意义,但我有点不确定实现它的最佳方式。那里有我编辑的 – Bromide 2010-07-08 14:48:30

+0

。只要确保了解我所做的事情,以便您可以在其他情况下使用此:) – pgsandstrom 2010-07-09 09:19:46

3

如果您的应用程序将具有更多按钮,则应该使用SoundPool而不是MediaPlayer。由于MediaPlayer会毁掉你的应用程序,所以它不能播放声音了。

这帮了我一个忙!我想你也会这样 Play sound with SoundPool

相关问题