[英]Playing and Releasing audio in 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. 我正在学习android,目前正在学习RecyclerView,因此在此示例中,我在单击播放按钮时播放特定的原始声音文件,然后在完成播放时将其释放。 I could seriously use some pointers on what is the best practice however as I have a few issues and questions:
我可能会在最佳做法上认真使用一些指针,但是由于存在一些问题,我会:
What is the best practice for setting up your mediaPlayer and managing your resources correctly with RecyclerView and what am I doing wrong that would cause crashes and "slowness"? 使用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();
}
});
}
});
}
If you're only listening in user interaction you can drop setOnCompleteListener()
and instead define your play/stop code in (in order) OnLongClickListener()
and OnClickListener
. 如果仅在用户交互中进行监听,则可以删除
setOnCompleteListener()
,而是按顺序(按顺序) OnLongClickListener()
/ OnLongClickListener()
和OnClickListener
播放/停止代码。 Like this: 像这样:
holder.playBtn.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
//Code to stop playing and release resources
}
});
holder.playBtn.setOnLongClickListener(new View.OnClickListener(){
@Override
public void onLongClick(View v) {
//Code to start playing
return false; //!!This is important so that OnClick() would be called after releasing the button
}
});
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. OBS在回答我自己的问题时,我不能说这是一种非常好的做法,但是它确实解决了我遇到的问题,如果有人发现错误或有更好的更有效的方法,请发表答案并进行详细说明。
The app no longer crashes and onCompletionListener should clear all resources, this is the current code: 该应用不再崩溃,onCompletionListener应该清除所有资源,这是当前代码:
//class variable mediaplayer and onCompletionListener method //类变量mediaplayer和onCompletionListener方法
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);
}
}
});
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.