需求:项目要求获取网络视频并获取视频第一帧展示在页面上
操作:简单,直接百度搜索,获悉
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
retriever.setDataSource(params[0], new HashMap<String, String>());//这里插嘴,这个是获取网络视频的,不管有木有参数要传都new个hash进去。PS:什么?不明白这个params[0],往下看
//retriever.setDataSource(params[0]); 这个是获取本地视频的
retriever.setDataSource(params[0]);
Bitmap bitmap = retriever.getFrameAtTime();
嗯,完美 真香 。。。。。
问题:卧槽,怎么划不动。。。ANR 大爷的
分析:原生耗时操作,因为要生成bitmap图片 都知道,这玩意又大又不好优化。。。怎么搞?当然是不放在主线程咯
解决:异步处理
class MyTask extends AsyncTask<String, Integer, Bitmap> { private ViewHolder viewHolder; public MyTask(ViewHolder viewHolder) { this.viewHolder = viewHolder; } @Override protected void onPreExecute() { } @Override protected Bitmap doInBackground(String... params) { MediaMetadataRetriever retriever = new MediaMetadataRetriever(); if (Build.VERSION.SDK_INT >= 14) { retriever.setDataSource(params[0], new HashMap<String, String>()); } else { retriever.setDataSource(params[0]); } Bitmap bitmap = retriever.getFrameAtTime(); retriever.release(); return bitmap; } @Override protected void onProgressUpdate(Integer... values) { } @Override protected void onPostExecute(Bitmap result) { RequestOptions options = new RequestOptions() .error(R.mipmap.no_pic) .placeholder(R.mipmap.no_pic); if(!activity.isFinishing()){ Glide.with(context).load(result).apply(options).into(viewHolder.getItemPicBinding().pic); } this.cancel(true); } }
直接源码,新手都懂,拿上麻溜的滚,另外RX解决这个问题更简单,我懒得写,因为是老项目(马上要上一个不一样的),也不用添加依赖了。。。另外,我添加下划线的地方记住加上,别泄露了。。。。拜了个拜