【问题标题】:recyler listview with textureview is slow while scrolling滚动时带有textview的回收器列表视图很慢
【发布时间】:2017-04-17 09:11:48
【问题描述】:

我有 recyler listviewTextureView,我正在将 URI(原始文件夹中的视频)设置为纹理视图,并且适配器实现 TextureView.SurfaceTextureListener 在此之后我得到以下方法的接口

  1. onSurfaceTextureAvailable
  2. onSurfaceTextureSizeChanged
  3. onSurfaceTextureDestroyed

onSurfaceTextureAvailable 中,我正在设置我的 MediaPlayer 并开始播放视频。但问题是在滚动列表时它会卡住。(并且加载缓慢)。

以下是我的代码。

提前致谢。

MyAdapter.java

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> implements TextureView.SurfaceTextureListener  {

private List<Model> list = new ArrayList<>();
private Context context;
private MediaPlayer mediaPlayer =null;
Uri uri;


public MyAdapter(Context context, List<Model> l) {
    this.list = l;
    this.context = context;
    uri = Uri.parse("android.resource://" + context.getPackageName() + "/" + R.raw.malhari1);
}

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

    return new MyViewHolder(itemView);
}


@Override
public long getItemId(int position) {
    return super.getItemId(position);
}


@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
    holder.setIsRecyclable(false);

    holder.name.setText(list.get(position).getName());

    holder.textureView.setSurfaceTextureListener(this);

}



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

@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {

    System.out.println("onSurfaceTextureAvailable");

    setMediaPlayer(surface, uri);
}

private void setMediaPlayer(SurfaceTexture surface, Uri uri) {

    MediaPlayer mediaPlayer = new MediaPlayer();
    mediaPlayer.setSurface(new Surface(surface));
    try {
        mediaPlayer.setDataSource(context,uri);
        mediaPlayer.prepare();
        mediaPlayer.start();
       // mediaPlayerTemp = mediaPlayer;
        mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                if (mp != null) {
                    mp.start();
                }
            }
        });

    } catch (Exception e) {
        e.printStackTrace();
    }
}

@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {

}

@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
  System.out.println("onSurfaceTextureDestroyed");
    return false;
}

@Override
public void onSurfaceTextureUpdated(SurfaceTexture surface) {
}


public  class MyViewHolder extends  RecyclerView.ViewHolder{
    public TextView name;
    TextureView textureView;

    public MyViewHolder(View itemView) {
        super(itemView);
        name = (TextView)itemView.findViewById(R.id.tvName);
        textureView = (TextureView) 
 itemView.findViewById(R.id.textureView);
    }
}

  }

MainActivity.java

public class MainActivity extends AppCompatActivity {

private List<Model> list = new ArrayList<>();
RecyclerView recyclerView;
MyAdapter adapter;
RecyclerView.LayoutManager mLayoutManager;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    recyclerView = (RecyclerView) findViewById(R.id.recycler_view);

    adapter = new MyAdapter(MainActivity.this,list);
    mLayoutManager = new LinearLayoutManager(getApplicationContext());
    recyclerView.setLayoutManager(mLayoutManager);
    recyclerView.setAdapter(adapter);


    setList();

}

private void setList() {

    for (int i = 0; i < 15; i++) {
        Model model = new Model();
        model.setName("Name : "+i);
        list.add(model);
    }

    adapter.notifyDataSetChanged();

}
  }

【问题讨论】:

    标签: android android-recyclerview media-player surfaceview


    【解决方案1】:

    首先从 url 下载视频,然后使用自定义播放器播放。这是我的做法:

    1) 获取所有需要播放的url

    2) 开始从本地存储中的 url 下载视频(在队列中),并在首选项中保留一个标志(视频是否已下载)

    3) 将 url 分配给 Adapter,在其中初始化处理视频播放的视频播放器控制器的对象

    4) 设置 addOnScrollListener 以检查当前可见的位置/视频,并检查视频是否已经下载,如果是,则播放它。

    【讨论】:

      【解决方案2】:

      我认为您正在尝试在 Recycler 视图中滚动播放视频,请查看以下库: 1)Toro

      2) VideoPlayerManager

      3)ExoPlayer

      【讨论】:

      • ExoPlayer 是 Android 的 MediaPlayer 的替代品。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-07
      • 2013-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-09
      • 1970-01-01
      相关资源
      最近更新 更多