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

时间:2017-01-22 18:36:17

标签: android audio android-mediaplayer

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

我创建了一个Adapter来加载列表视图中的元素,并在play上实现onClick监听器。

当我启动应用程序时,它正在正确加载列表,但音频存在一些问题。当我多次玩少量(如10-12个)项目(如100个)时,一切都不会产生任何问题。

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

enter image description here

python configure.py && make

我想问题是因为我创建了太多的Media Player对象。

如何解决?

2 个答案:

答案 0 :(得分:1)

我曾经遇到类似的问题,我做的是使用服务播放媒体文件。我正在分享我的所作所为。创建如下的服务

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);
            }
        });

让我知道它是否适合您。有一件事需要记住,您可能需要使用本地广播管理器来更改服务中的视图。

答案 1 :(得分:1)

MediaPlayer使用系统编解码器,如果您不释放以前创建的MediaPlayers,它们最终会结束。所以试着调用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();
       }
});