0

私は現在、どのボタンを押したかに応じてサウンドを再生するアプリを作成しています。問題は、100 個のボタンと 100 個の異なるサウンドが得られ、しばらくするとメモリがレイプされ、クラッシュして (-19,0) エラーが発生することです。私のコード、どうすればそれを回避できるか教えてもらえますか?? ありがとう

 package com.example.buttonsdemo;

    import android.media.MediaPlayer;
    import android.os.Bundle;
    import android.app.Activity;
    import android.support.v4.widget.SimpleCursorAdapter.ViewBinder;
    import android.util.Log;
    import android.view.Menu;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.Toast;

    public class MainActivity extends Activity implements View.OnClickListener{

        //Creating Sound arrays 
        MediaPlayer[] mediaplayer = new MediaPlayer[200];
        int i = 0;

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



            //Creating Button Array
            Button button[] = new Button [200]; 
            mediaplayer[1]= MediaPlayer.create(this,R.raw.alistar);
            mediaplayer[0]= MediaPlayer.create(this,R.raw.akali);






            button[i].setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                    switch(v.getId())
                    {

                case R.id.akali:
                                        i=0;
                    break;
                case R.id.alistar:
                    i=1;
                    break;
                            }
mediaplayer[1].start(); 
                }
            } );








    }

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub

        }




    }

編集:私はそれをより一般的にしようとしたので、1つだけ.start();を呼び出します。

4

1 に答える 1

0

ListViewまず最初に、クリック ターゲットに巨大なのではなく Android をArray使用する必要がありButtonsます。これにより、多くのメモリが節約されます。次に、MediaPlayers の大きなコレクションではなく、soundPool のようなものを使用する必要があります。そのルートが魅力的に見えない場合は、クリックごとに MediaPlayer を作成してから破棄する必要があります。これらの線に沿った簡単なソリューションは次のようになります。

メインクラス:

class MyActivity {
  private MediaPlayer mMediaPlayer;
  private HashMap<Integer, Integer> soundMap;
  private ListView mListView;
  private ArrayAdapter<Integer> mAdapter;

  @Override
  onCreate(Bundle savedInstanceState) {
    mAdapter = new MySimpleSoundAdapter();

    int[] sounds = {R.raw.alistar, R.raw.alkili, /*...*/ };

    mListView = findViewById(R.id.listView);
    mListView.setAdapter(new ArrayAdapter<Integer>(this, R.layout.textview, sounds));
    mListView.setOnItemClickListener(new OnItemClickListener() {
      @Override
      void onItemClick (AdapterView<?> parent, View view, int position, long id) {
        MediaPlayer mp = 
            MediaPlayer.create(MyActivity.this, (int) mAdapter.getItem(position);
        mp.start(); 
      }
    });
  }
}    
于 2013-03-05T01:45:12.153 に答える