什么?用MediaMetadataRetriever导致ANR了?看这里

需求:项目要求获取网络视频并获取视频第一帧展示在页面上

操作:简单,直接百度搜索,获悉

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解决这个问题更简单,我懒得写,因为是老项目(马上要上一个不一样的),也不用添加依赖了。。。另外,我添加下划线的地方记住加上,别泄露了。。。。拜了个拜

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值