在RecyclerView中播放和释放音频 [英] Playing and Releasing audio in RecyclerView
问题描述
我正在学习android,目前正在学习RecyclerView,因此在此示例中,我要在单击播放按钮时播放特定的原始声音文件,然后在完成播放后将其释放. 我可能会在最佳做法上认真使用一些指针,但是由于我有一些问题和疑问,所以:
I'm learning android and currently RecyclerView, so in this example I'm playing a specific raw sound file when clicking a play button and then releasing it when it's done. I could seriously use some pointers on what is the best practice however as I have a few issues and questions:
- 我在转换状态时遇到问题,因此如果我快速按一下播放键,我会得到 IllegalStateException ,可能是因为试图释放已经释放的玩家.
- 我显然也应该在发布后将其无效,并事先进行 null 检查,但是由于我是在嵌套作用域中使用它,因此必须将其声明为final,并且不能将其设为null,这会造成混淆,我显然错过了一些东西. 与在 viewHolder 类的整个行中添加clickListner相比,
- 在 onBindViewHolder 中的项目上设置clickListner似乎也明显慢得多,而且响应速度也较慢.
- I have a problem with transiting states so if I press play very quickly I'll get an IllegalStateException, probably from trying to release an already released player.
- I should apparently also nullify after release and do a null check prior but since I'm using it in a nested scope it has to be declared final and can't be nulled which is confusing, I've obviously missed something.
- setting the clickListner on an item in onBindViewHolder also seems significantly slower and less responsive than adding a clickListner on the entire row in the viewHolder class.
使用RecyclerView设置mediaPlayer和正确管理资源的最佳实践是什么,我在做错什么会导致崩溃和缓慢"?
//ViewHolder
//ViewHolder
public static class myHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
ImageView playBtn;
public myHolder(View v){
super(v);
playBtn = (ImageView) v.findViewById(R.id.playBtn);
v.setOnClickListener(this);
}
@Override
public void onClick(View v) {
}
}
//onBindViewHolder/onCompletionListener
//onBindViewHolder / onCompletionListener
@Override
public void onBindViewHolder(myHolder holder, int position) {
myClass item = itemList.get(position);
final MediaPlayer mediaPlayer = MediaPlayer.create(holder.itemView.getContext(), item.getAudioSource());
holder.playBtn.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
mediaPlayer.start();
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
mp.release();
}
});
}
});
}
推荐答案
OBS在回答我自己的问题时,我不能说这是一种很好的做法,但是它确实解决了我遇到的问题,如果有人发现了一个问题,错误或有更好更好的方法,请发表答案并进行详细说明.
OBS As I'm answering my own question I can NOT say that this is acctualy good practice but it did solve the issues I was having, if anyone spots an error or has a better more efficient way then please post an answer and elaborate.
- 我没有在onBindViewHolder中声明MediaPlayer,而是将其设置为类变量,这使我避免将其定型,并在发布后将其无效.
- 然后我在onClick方法中定义了它,以确保它永远不会为null并始终在需要时进行声明.
- 为了在onClick中使用它们,我必须将其持有人和"item"定为决赛,但这似乎奏效了(我猜是recyclerView魔术)
该应用不再崩溃,onCompletionListener应该清除所有资源,这是当前代码:
The app no longer crashes and onCompletionListener should clear all resources, this is the current code:
//类变量mediaplayer和onCompletionListener方法
//class variable mediaplayer and onCompletionListener method
MediaPlayer mediaPlayer;
//onCompletionListener method
MediaPlayer.OnCompletionListener mCompletionListener = new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
mp.release();
mediaPlayer = null;
}
};
//onBindViewHolder
//onBindViewHolder
@Override
public void onBindViewHolder(final itemHolder holder, int position) {
final Items item = mItemList.get(position);
holder.playBtn.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
mediaPlayer = MediaPlayer.create(holder.itemView.getContext(), item.getAudioSource());
if(mediaPlayer != null) {
mediaPlayer.start();
mediaPlayer.setOnCompletionListener(mCompletionListener);
}
}
});
}
这篇关于在RecyclerView中播放和释放音频的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!