2011-12-27 21 views
0

私はListViewとArrayAdapterを持っています。メソッドgetViewでは、各リスト要素にボタンを作成します。ここ は、私はボタンをクリックして、リストの一番下までスクロールするのであれば、音が途切れ取得方法onClickListViewアイテムonClickListenerとガベージコレクタ

public void onClick(View view) { 
    mediaPlayer = MediaPlayer.create(context, audioResourceId); 
    mediaPlayer.start(); 
    button.setBackgroundResource(R.drawable.ic_mic_pressed); 
    mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
     public void onCompletion(MediaPlayer mp) { 
      mp.release(); 
      button.setBackgroundResource(R.drawable.ic_mic); 
     } 
    }); 
} 

ための私のコードです。このリストアイテムは画面外にあり、ガベージコレクションされているため中断されていると思います。

ListViewを一番下までスクロールしたり、ビューを切り替えても、このサウンドを最後まで再生する方法はありますか?

答えて

4

MediaPlayerオブジェクトを保持する別のスレッドを作成する必要があります。ボタンをクリックすると、再生したいオーディオリソースを示すメッセージがそのスレッドに送信されます。

これを行う最も簡単な方法は、おそらくHandlerオブジェクトを使用することです。このオブジェクトはスレッドを管理し、スレッドと通信するためのメッセージキューを作成します。

+0

私は自分のサウンドを与えることができる静的な方法のようなものを作ると思っていました。これは動作しませんか? – Funtime

+0

はい、それはすぐに問題を解決します。しかし、一般的なルールとして、UIスレッドでは「重い持ち上げ」をしないでください。たとえ動作しても、この動作はしばしばパフォーマンスが低下する原因となります。 MediaPlayerの内部を見ることなく、最悪の場合を想定するのが最善です。 (実際にテストしたい場合は、アプリケーションのStrict Modeをオンにすることができます。UIスレッドのブロックI/Oが警告されます) –

+0

ハンドラが必要ですか?私はちょうどonClick(サウンドを再生することができます)MyThreadインスタンスを作成し、それを開始できますか? – Funtime

関連する問題