Android在Adapter中獲取網路視訊第一幀(優化)
阿新 • • 發佈:2018-12-06
獲取成功以後使用的是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(); } } }