当前位置: 首页 > 知识库问答 >
问题:

在回收站中播放和释放音频视图

从阎宝
2023-03-14

我正在学习Android和目前的回收器视图,所以在这个例子中,我在单击播放按钮时播放特定的原始声音文件,然后在完成后释放它。我可以认真地使用一些关于最佳实践的指针,但是因为我有一些问题和疑问:

  • 我有一个过渡状态的问题,所以如果我按播放非常快,我会得到一个IllegalStateException,可能是因为试图释放一个已经发布的播放器。
  • 显然,我也应该在发布后nullify并在之前进行null检查,但由于我在嵌套范围内使用它,因此必须声明它是最终的,并且不能为nulled,这令人困惑,我显然错过了一些东西。
  • 在onBindViewHolder中的项目上设置clickListner似乎也比在viewHolder类的整行上添加clickListner慢得多,响应也更慢。

使用RecyclerView设置mediaPlayer和正确管理资源的最佳做法是什么?我做错了什么会导致崩溃和“速度慢”?

//视图持有者

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

共有2个答案

易飞文
2023-03-14

OBS 当我回答我自己的问题时,我不能说这是很好的做法,但它确实解决了我遇到的问题,如果有人发现错误或有更好更有效的方法,那么请发布答案并详细说明。

  • 我没有在onBindViewHolder中声明MediaPlayer,而是将其作为一个类变量,这样可以避免将其设为final,并在发布后使其无效
  • 然后,我在onClick方法中定义了它,以确保它永远不会为空,并且总是在需要时声明
  • 为了在onClick中使用它们,我不得不将我的持有者和“物品”设置为最终状态,但这似乎奏效了(我猜是recyclerView magic)

应用不再崩溃,并在完成通知程序上清除所有资源,这是当前代码:

类变量媒体播放器和 onCompionListener 方法

MediaPlayer mediaPlayer;

//onCompletionListener method
MediaPlayer.OnCompletionListener mCompletionListener = new MediaPlayer.OnCompletionListener() {
    @Override
    public void onCompletion(MediaPlayer mp) {
        mp.release();
        mediaPlayer = null;
    }
};

上斌维支架

@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);
            }
        }
    });
}
曾光远
2023-03-14

如果您只在用户交互中收听,则可以删除 setOnCompleteListener(),而是在(按顺序)“一起”一起单击“()”点击控制器”中定义播放/停止代码。喜欢这个:

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
        }
    });
 类似资料:
  • 大家好,我正在尝试使用两个独立的媒体播放器实例播放音频和视频文件。当我从一开始播放它时,它工作得很好。但当我寻找时,我可以看到音频和视频的延迟 这是我寻找音频和视频的代码 //sikAudio(msec); if(media播放器!=null) { // 没有直播流,如果(medialayer.get持续时间() }

  • 主要内容:本节引言:,1.相关方法详解,2.使用代码示例,3.本节示例代码下载:,本节小结:本节引言: 本节带来的是Android多媒体中的——MediaPlayer,我们可以通过这个API来播放音频和视频 该类是Androd多媒体框架中的一个重要组件,通过该类,我们可以以最小的步骤来获取,解码 和播放音视频。它支持三种不同的媒体来源: 本地资源 内部的URI,比如你可以通过ContentResolver来获取 外部URL(流) 对于Android所支持的的媒体格式列表 对于Androi

  • 我正在开发一个音频播放器,它可以在后台播放音频文件。我的问题是,当录像机或视频播放器启动时,我需要暂停音频播放器。 有什么方法可以处理这个任务吗?例如,我有来处理这些调用。当我接到呼叫或wnat呼叫时,我们可以使用呼叫状态暂停播放器。我想为录像机或视频播放器以及相同的场景。当视频/录制开始时,我需要暂停音频播放器。

  • 问一下Xamarin.Forms便携里面Xamarin.Forms的音频怎么播放 正如我所知,有依赖服务,我看到了一些示例,只有iOS和Android,但没有Windows Phone 8.1/Windows 8.1和UWP。

  • 我在一个回收视图中有几张卡片。每张卡都有一个自定义视频视图。单击视频视图,视频应开始。然而,在我的例子中,它只显示蓝色边框,视频没有运行。代码如下所示, 自定义卡视图。xml: 自定义视频视图: 主要活动: activity\u main。xml: 我希望每张卡最初只显示一个缩略图。单击视频后,相关卡应启动视频(不是全部)。视频启动时,VideoView应占据整个屏幕。我怎样才能做到这一点? 谢谢

  • 问题内容: 我在android中实现了视频播放,这对android来说是全新的,这是我到目前为止收集的部分代码。 根据逻辑,它应该播放视频。不知道我在哪里做错了。 问题答案: