我有一个很大的列表视图。每个列表视图项都有一个播放按钮(图像)。点击该播放按钮,它将播放一些小音频文件。
我创建了一个Adapter来加载列表视图中的元素,并在play上实现onClick监听器。
当我启动应用程序时,它正在正确加载列表,但音频存在一些问题。当我多次玩少量(如10-12个)项目(如100个)时,一切都不会产生任何问题。
但是,如果我在列表中播放更多项目,如30-40项。它会停止为以后的项目加载音频文件。对于物品,它正在工作,它将继续工作,对于新的物品不起作用。
python configure.py && make
我想问题是因为我创建了太多的Media Player对象。
如何解决?
答案 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();
}
});