无法使用MediaPlayer对象在Android中播放许多音频文件
我有一个大的列表视图。每个列表视图项都有一个播放按钮(图像)。点击播放按钮,它将播放一些小的音频文件 我创建了一个适配器来加载列表视图中的元素,并在播放时实现了onClick侦听器 当我启动应用程序时,它正在正确加载列表,但音频中存在一些问题。当我玩几次(比如10-12次)游戏(比如100次)时,不会产生任何问题,一切都会顺利进行 但是如果我播放更多的项目,比如列表中的30-40个项目。它会停止加载后续项目的音频文件。对于项目,它正在工作,它将继续工作,对于新项目,它不工作。无法使用MediaPlayer对象在Android中播放许多音频文件,android,audio,android-mediaplayer,Android,Audio,Android Mediaplayer,我有一个大的列表视图。每个列表视图项都有一个播放按钮(图像)。点击播放按钮,它将播放一些小的音频文件 我创建了一个适配器来加载列表视图中的元素,并在播放时实现了onClick侦听器 当我启动应用程序时,它正在正确加载列表,但音频中存在一些问题。当我玩几次(比如10-12次)游戏(比如100次)时,不会产生任何问题,一切都会顺利进行 但是如果我播放更多的项目,比如列表中的30-40个项目。它会停止加载后续项目的音频文件。对于项目,它正在工作,它将继续工作,对于新项目,它不工作。 公共类WordL
公共类WordListAdapter扩展了BaseAdapter{
私有ArrayList wordArrayList;
私人活动;
专用静态充气机=空;
MediaPlayer mp;
公共WordListAdapter(活动活动,ArrayList wordArrayList){
这个。活动=活动;
this.wordArrayList=wordArrayList;
充气器=(LayoutInflater)activity.getSystemService(Context.LAYOUT\u充气器\u SERVICE);
}
@凌驾
public int getCount(){
返回wordArrayList.size();
}
@凌驾
公共对象getItem(int位置){
返回位置;
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
@凌驾
公共视图getView(最终整型位置、最终视图转换视图、最终视图组父视图){
视图=转换视图;
if(convertView==null){
视图=充气机。充气(R.layout.item_word,空);
}
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);
setText(wordArrayList.get(position.lang1);
setText(wordArrayList.get(position.lang2);
if(wordArrayList.get(position.pic==0){
imageWord.setVisibility(消失);
}
否则{
setImageResource(wordArrayList.get(position.pic);
}
playWord.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
mp=MediaPlayer.create(activity,wordArrayList.get(position.audio));
mp.start();
}
});
返回视图;
}
}
我想问题是因为我创建了太多的媒体播放器对象。
如何修复它?我曾经遇到过类似的问题,我所做的就是使用该服务播放媒体文件。我正在分享我所做的。创建一个如下所示的服务
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;
}
}
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;
}
}
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);
}
});
让我知道它是否适合你。这里需要记住的一点是,您可能需要使用本地广播管理器来更改您服务的视图 MediaPlayer使用系统编解码器,如果您不释放先前创建的MediaPlayer,系统编解码器最终将终止。因此,尝试调用mp.release()。例如,试试这个(只是我不确定它是否会工作-发布本身):
您是从手机存储器播放音频还是从手机播放流媒体
MediaPlayer.create(activity,wordArrayList.get(position.audio)
我正在从资源中加载音频文件。所有音频文件(大约100个)都在资源中。