8

私のAndroidアプリケーションで現在何が起こっているのですか?

単純な画像をボタンにマッピングし、クリックすると音が鳴るようにしました。クリックするたびに、rawフォルダーにサウンドファイルを含むMediaPlayerオブジェクトを作成し、そのMediaPlayerオブジェクトにOnClickListenerを設定して、ファイルの再生を停止して解放し、MediaPlayerオブジェクトを再生します。

定義されたセクションのコード:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_activity);
    ImageButton start = (ImageButton) findViewById(R.id.imageButton1);
    start.setOnClickListener(new OnClickListener() {

        public void onClick(View v) {
            MediaPlayer play = MediaPlayer.create(MainActivity.this, R.raw.dvno);
            play.setOnCompletionListener(new OnCompletionListener() {
                public void onCompletion(MediaPlayer mp) {
                    mp.stop();
                    mp.release();
                    mp = null;
                }
            });
            play.start();
        }
    });
}

どうしたの:

それは正常に動作し、クラッシュしませんが、メモリにとってはひどく、一般的に非常に遅いです。できるだけ速くボタンを何回も続けてクリックし、音が重なって瞬時に何度も再生されるのを聞いてほしい。クリックするたびに新しいMediaPlayerオブジェクトを作成し、それが終了して解放されるのを待つと、多くのリソースが消費され、ボタンを実際に押すのに音が遅れることがよくあります。MediaPlayerオブジェクトとして、重ねて再生できる単一のサウンドを作成できるようにしたいと思います。

考えられる解決策:

onClickではなくonCreateのスコープで単一の最終的なMediaPlayerオブジェクトを作成し、何らかの方法でスレッドを使用して、クリックするたびにMediaPlayerオブジェクトを開始します。これが可能な解決策かもしれないと読みましたが、これまでスレッドを使用したことがなく、現在のコードよりも遅いかどうかわからないので、スレッドがあるかどうかを知りたいです。より単純なスレッドを使用しないソリューション。単一のMediaPlayerの状態を操作してそれ自体をオーバーラップさせることは、現時点では不可能に思えますが、おそらく私は間違っています。

これは違法な状態のためにプログラムをクラッシュさせますか?そうでない場合、これは私が望むよりも遅くなるでしょうか?そうでない場合、誰かが私のコードの修正を提案できますか?

4

1 に答える 1

6

これには、MediaPlayerの代わりにSoundPoolを使用することをお勧めします。チュートリアルはこちら

于 2012-10-21T19:39:11.650 に答える