无法使用MediaPlayer对象在Android中播放许多音频文件

无法使用MediaPlayer对象在Android中播放许多音频文件,android,audio,android-mediaplayer,Android,Audio,Android Mediaplayer,我有一个大的列表视图。每个列表视图项都有一个播放按钮(图像)。点击播放按钮,它将播放一些小的音频文件 我创建了一个适配器来加载列表视图中的元素,并在播放时实现了onClick侦听器 当我启动应用程序时,它正在正确加载列表,但音频中存在一些问题。当我玩几次(比如10-12次)游戏(比如100次)时,不会产生任何问题,一切都会顺利进行 但是如果我播放更多的项目,比如列表中的30-40个项目。它会停止加载后续项目的音频文件。对于项目,它正在工作,它将继续工作,对于新项目,它不工作。 公共类WordL

我有一个大的列表视图。每个列表视图项都有一个播放按钮(图像)。点击播放按钮,它将播放一些小的音频文件

我创建了一个适配器来加载列表视图中的元素,并在播放时实现了onClick侦听器

当我启动应用程序时,它正在正确加载列表,但音频中存在一些问题。当我玩几次(比如10-12次)游戏(比如100次)时,不会产生任何问题,一切都会顺利进行

但是如果我播放更多的项目,比如列表中的30-40个项目。它会停止加载后续项目的音频文件。对于项目,它正在工作,它将继续工作,对于新项目,它不工作。

公共类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个)都在资源中。