1. Я использую код ниже, чтобы получить список видео и миниатюру с 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 } ; Курсор курсора = 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 extends 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();
        }
    }
    
0
user 1234 17 Авг 2019 в 11:20

2 ответа

Лучший ответ

Эта строка, вероятно, замедляет процесс загрузки. В худшем случае это может вызвать исключение OOM

ThumbnailUtils.createVideoThumbnail(imagePath, MediaStore.Video.Thumbnails.MINI_KIND);

По состоянию на

video.setThumbnail(getThumbNail((cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA)))));

Всегда рекомендуется загружать растровое изображение только при необходимости, если только не существует строгого управления памятью. Чтобы сэкономить время, я бы разрешил загрузку растрового изображения в Glide или любую другую подобную библиотеку. тем не менее, измените на:

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());

И внутри onBindViewHolder адаптера recyclerView загружайте видео растровое изображение динамически с Glide например:

 @Override
    public void onBindViewHolder(YourAdapter.ItemViewHolder holder, int position) {
        Video v = videoItemHashset.get(position);

        Glide.with(your_context)
                .asBitmap()
                .load(Uri.fromFile(new File(v.getVideoPath())))
                .centerCrop()
                .into(holder.videoThumbnailImageView);

        holder.mPosition = position;///in case you're going to need it for playing the video at that position
    }
0
Rachid Rajjys 17 Авг 2019 в 11:26
public static Bitmap retriveVideoFrameFromVideo(String videoPath)throws Throwable
{
    Bitmap bitmap = null;
    MediaMetadataRetriever mediaMetadataRetriever = null;
    try
    {
        mediaMetadataRetriever = new MediaMetadataRetriever();
        if (Build.VERSION.SDK_INT >= 14)
            mediaMetadataRetriever.setDataSource(videoPath, new HashMap<String, String>());
            else
                mediaMetadataRetriever.setDataSource(videoPath);
     //   mediaMetadataRetriever.setDataSource(videoPath);
        bitmap = mediaMetadataRetriever.getFrameAtTime(1, MediaMetadataRetriever.OPTION_CLOSEST);
    }
    catch (Exception e)
    {
        e.printStackTrace();
        throw new Throwable("Exception in retriveVideoFrameFromVideo(String videoPath)"+ e.getMessage());
    }
    finally
    {
        if (mediaMetadataRetriever != null)
        {
            mediaMetadataRetriever.release();
        }
    }
    return bitmap;
}`enter code here`
0
bishal 17 Авг 2019 в 11:23