1. 程式人生 > >Android在Adapter中獲取網路視訊第一幀(優化)

Android在Adapter中獲取網路視訊第一幀(優化)

 獲取成功以後使用的是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();
            }
        }
    }