在RecyclerView中发布ExoPlayer [英] Release ExoPlayer in RecyclerView

查看:514
本文介绍了在RecyclerView中发布ExoPlayer的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在RecyclerView中实现ExoPlayer.但是在滚动时,视频停止,但音频不停止.

I am implementing the ExoPlayer in a RecyclerView. But while scrolling the Video stops, but not the audio.

如何在RecyclerView中释放ExoPlayer?或者如何获取回收对象的位置,以便能够释放ExoPlayer?

How can I release the ExoPlayer in the RecyclerView? Or how can I get the position of the Recycled Object so I am able to release the ExoPlayer?

这是我的数据对象

public class            enter code here           Video {
    private String url;
    private Context context;
    Boolean playWhenReady = false;
    int currentWindow = 0;
    long playbackPosition = 0;
    ExoPlayer player;

    public Video(String url, Context context) {
        this.url = url;
        this.context = context;
    }

    public void setCurrentWindow(int currentWindow) {
        this.currentWindow = currentWindow;
    }

    public void setPlaybackPosition(long playbackPosition) {
        this.playbackPosition = playbackPosition;
    }

    public void setPlayWhenReady(Boolean playWhenReady) {
        this.playWhenReady = playWhenReady;
    }

    public void setPlayer(ExoPlayer player) {
        this.player = player;
    }

    public ExoPlayer getPlayer() {
        return player;
    }

    public String getUrl() {
        return url;
    }

    public Context getContext() {
        return context;
    }

    public Boolean getPlayWhenReady() {
        return playWhenReady;
    }

    public int getCurrentWindow() {
        return currentWindow;
    }

    public long getPlaybackPosition() {
        return playbackPosition;
    }
}

这是我的适配器类: 我使用onViewRecycled()方法进行了尝试,但是由于找不到位置,所以无法释放播放器.

And this my Adapter Class: I tried it with the onViewRecycled() Method, but because I dont get the position i can´t release the player.

public class VideoAdapter extends RecyclerView.Adapter<VideoAdapter.ViewHolder> {
    private ArrayList<Video> mDataset;


    public static class ViewHolder extends RecyclerView.ViewHolder {
        public PlayerView mExoPlayer;

        public ViewHolder(View itemView) {
            super(itemView);
            mExoPlayer = itemView.findViewById(R.id.video_view);
        }
    }

    public VideoAdapter(ArrayList<Video> myDataset) {
        mDataset = myDataset;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View itemView=LayoutInflater.from(parent.getContext())
                .inflate(R.layout.list_item, parent, false);

        return new ViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {


        initPlayer(holder,position);

    }

    private void initPlayer(ViewHolder holder,int position) {
        mDataset.get(position).setPlayer(ExoPlayerFactory.newSimpleInstance(
                new DefaultRenderersFactory(mDataset.get(position).getContext()),
                new DefaultTrackSelector(), new DefaultLoadControl()));

        holder.mExoPlayer.setPlayer(mDataset.get(position).getPlayer());

        mDataset.get(position).getPlayer().setPlayWhenReady(mDataset.get(position).getPlayWhenReady());
        mDataset.get(position).getPlayer().seekTo(mDataset.get(position).getCurrentWindow(), mDataset.get(position).getPlaybackPosition());

        Uri uri = Uri.parse(mDataset.get(position).getUrl());
        MediaSource mediaSource = buildMediaSource(uri);
        mDataset.get(position).getPlayer().prepare(mediaSource, true, false);
    }

    private MediaSource buildMediaSource(Uri uri) {

        return new ExtractorMediaSource.Factory(
                new DefaultHttpDataSourceFactory("exoplayer-codelab")).
                createMediaSource(uri);
    }


    @Override
    public int getItemCount() {
        return mDataset.size();
    }

    @Override
    public void onViewRecycled(@NonNull ViewHolder holder) {
        super.onViewRecycled(holder);
    }


}

推荐答案

我认为在回收播放器的视图时释放播放器是最干净的方法.

I think that it would be cleanest to release the player when its view is recycled.

适配器类:

@Override
public void onViewRecycled(@NonNull ViewHolder holder) {
    int position = holder.getAdapterPosition();
    if (mDataset.get(position) != null) {
        mDataset.get(position).getPlayer().release();
    }
    super.onViewRecycled(holder);
}

这篇关于在RecyclerView中发布ExoPlayer的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆