2017-01-22 4 views
4

大きなリストビューがあります。各リストビュー項目には再生ボタン(画像)があります。その再生ボタンをクリックすると、小さなオーディオファイルが再生されます。MediaPlayerオブジェクトを使用して多数のオーディオファイルをAndroidで再生できません

私は、リストビューで要素をロードするためのアダプタを作成し、再生時にonClickリスナーを実装しました。

アプリケーションを起動すると、リストが正しく読み込まれていますが、オーディオに問題があります。私が(10-12のような)アイテムを何度も(100のように)何度も演奏すると、問題は発生しません。すべてがスムーズに実行されます。

しかし、私がリスト内の30-40個のアイテムのように多くのアイテムをプレイした場合、後の項目のオーディオファイルのロードを停止します。アイテムについては、機能していない新しいアイテムについては機能し続けました。

enter image description here

public class WordListAdapter extends BaseAdapter{ 
    private ArrayList<Word> wordArrayList; 
    private Activity activity; 
    private static LayoutInflater inflater=null; 
    MediaPlayer mp; 

    public WordListAdapter(Activity activity, ArrayList<Word> wordArrayList) { 
     this.activity = activity; 
     this.wordArrayList = wordArrayList; 
     inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    @Override 
    public int getCount() { 
     return wordArrayList.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return position; 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public View getView(final int position, final View convertView, final ViewGroup parent) { 
     View view = convertView; 
     if(convertView == null) { 
      view = inflater.inflate(R.layout.item_word, null); 
     } 

     TextView word1 = (TextView) view.findViewById(R.id.word1); 
     TextView word2 = (TextView) view.findViewById(R.id.word2); 
     ImageView imageWord = (ImageView) view.findViewById(R.id.imageWord); 
     ImageView playWord = (ImageView) view.findViewById(R.id.playWord); 

     word1.setText(wordArrayList.get(position).lang1); 
     word2.setText(wordArrayList.get(position).lang2); 

     if(wordArrayList.get(position).pic == 0) { 
      imageWord.setVisibility(GONE); 
     } 
     else { 
      imageWord.setImageResource(wordArrayList.get(position).pic); 
     } 

     playWord.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       mp = MediaPlayer.create(activity, wordArrayList.get(position).audio); 
       mp.start(); 
      } 
     }); 

     return view; 
    } 
} 

私はあまりにも多くのメディアプレーヤーオブジェクトを作成しているため、問題があると思います。

どのように修正するのですか?

+0

携帯電話のストレージやストリーミングからオーディオを再生していますか? –

+0

電話から。 'MediaPlayer.create(activity、wordArrayList.get(position).audio)' リソースからオーディオファイルをロードしています。 –

+0

すべてのオーディオファイル(約100)がリソースにあります。 –

答えて

1

私はかつて同じような問題に直面していましたが、私はメディアファイルを再生するためにサービスを利用することにしました。私は自分がしたことを分かち合っている。

 playWord.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Intent serviceIntent = new Intent(getActivity(),PlayMusicService.class); 
       serviceIntent.putExtra("musicResource", wordArrayList.get(position).audio); 
      } 
     }); 

が、それはあなたのために働くなら、私が知ってみよう、次のように、このサービスを呼び出すその後

public class PlayMusicService extends Service 
     implements MediaPlayer.OnCompletionListener, MediaPlayer.OnErrorListener { 

    private int audioResource; 
    public static MediaPlayer player; 


    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 

     audioResource = intent.getIntExtra("musicResource",0); 
     player = MediaPlayer.create(this, audioResource); 
     player.setLooping(false); 
     player.setVolume(100, 100); 
     player.setOnCompletionListener(this); 
     player.setOnErrorListener(this); 
     player.start(); 
     return START_NOT_STICKY; 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     player.stop(); 
     player.release(); 
    } 

    @Nullable 
    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 


    @Override 
    public void onCompletion(MediaPlayer mediaPlayer) { 
     this.onDestroy(); 
    } 

    @Override 
    public boolean onError(MediaPlayer mediaPlayer, int i, int i1) { 
     return false; 
    } 
} 

を、以下のようなサービスを作成します。ここで覚えておかなければならないことは、サービスからビューを変更するためにローカルブロードキャストマネージャを使用する必要があるかもしれないことです。

1

MediaPlayerはシステムコーデックを使用します。以前に作成したMediaPlayerをリリースしないと、最終的に終了します。だからmp.release()を呼び出してみてください。たとえば、これを試してみてください(それは正常に動作するかどうかはわかりません)。

playWord.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      mp = MediaPlayer.create(activity, wordArrayList.get(position).audio); 
      mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
       @Override 
       public void onCompletion(MediaPlayer mediaPlayer) { 
        mediaPlayer.release(); 
       } 
      }); 
      mp.start(); 
     } 
}); 
関連する問題