Android在Adapter中获取网络视频第一帧(优化)
  ttOzQgS7km1w 2023年12月12日 14 0


 获取成功以后使用的是map保存,key为adapter的position 避免销毁再次加载

@SuppressLint("UseSparseArrays")
    private Map<Integer, Bitmap> bitmapMap = new HashMap<>();//bitmap的集合
    @SuppressLint("HandlerLeak")
    private final Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case 1:
                    myHolder.image_video.setImageBitmap((Bitmap) msg.obj);
                    break;
            }
            super.handleMessage(msg);
        }
    };

 下面就是获取的方法

private void loadVideo(@NonNull MyHolder holder,String video) {
        Log.e("loadVideo", video);
        if (video.contains(".mp4") || video.contains(".avi") || video.contains(".rmvb") || video.contains(".3gp")) {
            if (bitmapMap.containsKey(holder.getAdapterPosition())) {
                bitmap = bitmapMap.get(holder.getAdapterPosition());
                holder.image_video.setImageBitmap(bitmap);//集合要是存在就设置上
            } else {

                Thread t = new Thread(new Runnable() {
                    public void run() {//开启线程获取视频第一帧
                        MediaMetadataRetriever retriever = new MediaMetadataRetriever(); //获取网络视频
                        try {
                            retriever.setDataSource(video, new HashMap<String, String>());
                            bitmap = retriever.getFrameAtTime();
                            bitmapMap.put(holder.getAdapterPosition(), bitmap);
                            if (bitmap != null) {
                                Message message = handler.obtainMessage();//用handler发送通知
                                message.what = 1;
                                message.obj = bitmap;
                                handler.sendMessage(message);
                            }
                        } catch (IllegalArgumentException e) {
                            e.printStackTrace();
                        } catch (RuntimeException e) {
                            e.printStackTrace();
                        } finally {
                            try {
                                retriever.release();
                            } catch (RuntimeException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                });
                t.start();
            }
        }
    }

 

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年12月12日 0

暂无评论

推荐阅读
ttOzQgS7km1w