【发布时间】:2019-08-17 08:20:30
【问题描述】:
-
我正在使用以下代码从视频 URL 获取视频列表和缩略图 但在回收站视图上加载数据需要 5 秒以上。
public class VideoAsync extends AsyncTask { private static final String TAG = "VideoAsync"; private VideoAdapter videoAdapter; private RecyclerView recyclerView; private List<Video> videoList; private Context context; public VideoAsync(RecyclerView recyclerView, Context context) { this.recyclerView = recyclerView; this.videoList = new ArrayList<>(); this.context = context; } @Override protected Object doInBackground(Object[] objects) { return getAllMedia(); } @Override protected void onPostExecute(Object o) { super.onPostExecute(o); videoAdapter = new VideoAdapter(getAllMedia(), context); recyclerView.setAdapter(videoAdapter); videoAdapter.notifyDataSetChanged(); } private List<Video> getAllMedia() { HashSet<Video> videoItemHashSet = new HashSet<>(); String[] projection = { MediaStore.Video.VideoColumns.DATA ,MediaStore.Video.Media.TITLE,MediaStore.Video.VideoColumns.DURATION}; 光标 cursor = context.getContentResolver().query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, 投影 ,空,空,空); 尝试 { cursor.moveToFirst();
do{ Video video = new Video(); video.setVideoPath((cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA)))); video.setVideoTitle((cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.TITLE)))); video.setVideoDuration(duration(cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATION)))); video.setThumbnail(getThumbNail((cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA))))); videoItemHashSet.add(video); }while(cursor.moveToNext()); cursor.close(); } catch (Exception e) { e.printStackTrace(); } videoList.addAll(videoItemHashSet); Log.d(TAG, "getAllMedia: "+ videoList.size()) ; return videoList; } private static Bitmap getThumbNail(String imagePath){ return ThumbnailUtils.createVideoThumbnail(imagePath, MediaStore.Video.Thumbnails.MINI_KIND); } private static String duration(String time){ long duration = Long.parseLong(time); return String.format("%d:%d", TimeUnit.MILLISECONDS.toMinutes(duration), TimeUnit.MILLISECONDS.toSeconds(duration) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(duration)) ); } } //Video fragment这里,Adapter 设置在 Videoasync 类中。 公共类 VideosFragment 扩展 Fragment {
@BindView(R.id.rv_video) RecyclerView recyclerView; private VideoAsync videoAsync; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_videos, container, false); ButterKnife.bind(this, view); setRecyclerView(); return view; } private void setRecyclerView(){ recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); videoAsync = new VideoAsync(recyclerView, getContext()); videoAsync.execute(); } }
【问题讨论】:
-
检查缩略图的大小。
-
私有静态位图 getThumbNail(String imagePath){ return ThumbnailUtils.createVideoThumbnail(imagePath, MediaStore.Video.Thumbnails.MINI_KIND); }//这个方法需要时间从url制作缩略图
-
如果尺寸很大,加载会需要时间。
标签: android