【发布时间】:2017-09-06 21:03:31
【问题描述】:
我正在学习 android,目前正在学习 RecyclerView,所以在这个例子中,我在单击播放按钮时播放特定的原始声音文件,然后在完成后释放它。 我可以认真地使用一些关于最佳实践的指示,但是因为我有一些问题和疑问:
- 我在转换状态时遇到问题,所以如果我很快按下播放键,我会收到 IllegalStateException,可能是因为试图释放已发布的播放器。
- 我显然也应该在发布后取消并事先进行 null 检查,但由于我在嵌套范围内使用它,因此必须将其声明为最终且不能为空,这会造成混淆,我显然错过了什么。
- 在 onBindViewHolder 中的项目上设置 clickListner 似乎也比在 viewHolder 类中的整行上添加 clickListner 慢得多,响应速度也慢。
设置 mediaPlayer 和使用 RecyclerView 正确管理资源的最佳做法是什么?我做错了什么会导致崩溃和“缓慢”?
//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
@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();
}
});
}
});
}
【问题讨论】:
-
你为什么要“收听”媒体播放器?如果您需要对用户交互做出反应,为什么不添加两个侦听器:onLongClick() 和 onClick()。 LongClick 可以启动,当用户停止按下时,会自动调用 onClick(),您可以在此处停止播放。
-
其实我不需要停止播放,我使用的声音文件只有1-2s长。 setOnCompleteListener 是这样的,当文件播放完毕时,它会释放所有资源,如果这就是你的意思。
-
在全局或活动或适配器中声明 MediaPlayer - 将 MediaPlayer 的实例传递给 Viewholder 并尝试它应该工作的相同。
标签: java android android-recyclerview android-mediaplayer