从 URL 滞后片段加载 VideoView

Posted

技术标签:

【中文标题】从 URL 滞后片段加载 VideoView【英文标题】:Loading VideoView from URL lags fragment 【发布时间】:2017-03-22 17:20:48 【问题描述】:

编辑:我想我可能已经找到了解决方案。我没有使用VideoView,而是切换到TextureView的这个实现:

https://github.com/sprylab/texturevideoview

但是有人能解释一下为什么这似乎解决了我的问题吗?


我有一个简单的片段,可以将视频(从外部 URL)加载到 VideoView 中。

问题是,当调用片段时,直到视频完全加载它才会显示。最终加载片段通常需要 1-3 秒。我相信这可能与 VideoView 加载阻塞主 UI 线程有关?不过我不是 100% 确定。

这是我的片段:

public class MyFragment extends DialogFragment 

    private User user;

    private ViewPager viewPager;

    private MyViewPagerAdapter myViewPagerAdapter;

    public static MyFragment newInstance() 
        MyFragment fragment = new MyFragment();

        return fragment;
    

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) 
        View v = inflater.inflate(R.layout.fragment_main, container, false);

        viewPager = (ViewPager) v.findViewById(R.id.viewPager);

        user = Parcels.unwrap(getArguments().getParcelable("user"));

        myViewPagerAdapter = new MyViewPagerAdapter();
        viewPager.setAdapter(myViewPagerAdapter);

        setCurrentItem(selectedPosition);

        return v;
    

    private void setCurrentItem(int position) 
        viewPager.setCurrentItem(position, false);
    

    @Override
    public void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setStyle(DialogFragment.STYLE_NORMAL, android.R.style.Theme_Black_NoTitleBar_Fullscreen);
    

    public class MyViewPagerAdapter extends PagerAdapter 

        private LayoutInflater layoutInflater;

        private VideoView videoView;

        public MyViewPagerAdapter() 
            //
        

        @Override
        public Object instantiateItem(ViewGroup container, int position) 
            layoutInflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);

            View view = layoutInflater.inflate(R.layout.video_layout, container, false);

            UserVideo video = user.getVideos().get(position);

            videoView = (VideoView) view.findViewById(R.id.video);

            Uri videoUri = Uri.parse(video.getUrl());

            videoView.setVideoURI(videoUri);
            videoView.setMediaController(null);
            videoView.requestFocus();
            videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() 
                public void onPrepared(MediaPlayer mp) 
                    videoView.start();
                    mp.setLooping(true);
                
            );

            container.addView(view);

            return view;
        

        @Override
        public int getCount() 
            return user.getVideos().size();
        

        @Override
        public boolean isViewFromObject(View view, Object obj) 
            return view == ((View) obj);
        

        @Override
        public void destroyItem(ViewGroup container, int position, Object object) 
            container.removeView((View) object);
        
    

我应该改变什么来阻止片段加载这么长时间?

我尝试在另一个线程中关注this solution,但片段加载/显示仍需要 1-3 秒:

https://gist.github.com/anonymous/b4fb728816962c7d208f8d85e7bdba26

【问题讨论】:

【参考方案1】:

不要将媒体控制器设置为空,而是将媒体控制器添加到视图中。查看https://examples.javacodegeeks.com/android/android-videoview-example/的示例

【讨论】:

我将媒体控制器设置为空,这样它就不会显示视频控件。不确定这有什么帮助...【参考方案2】:

不确定这是否会有所帮助,但 videoView 是否应该设置 mediaController:

    videoView.setMediaController(mediaController);

【讨论】:

我将其设置为 null 以使视频控件不显示。 然后删除它,VideoView应该可以在没有它的情况下工作。 视频可能正在缓冲,请参阅***.com/questions/15941976/…。 同样,这些解决方案都不相关。我相信,就像我在问题中所说的那样,在加载视频时,主 UI 线程被阻塞了。我需要一个解决方案来解决这个问题。 好的,希望对您有所帮助:***.com/questions/24529090/…

以上是关于从 URL 滞后片段加载 VideoView的主要内容,如果未能解决你的问题,请参考以下文章

SKView集成到UIViewController中,UITextFields滞后

Swift,将更多数据加载到表视图中会导致滚动滞后

UICollectionView初始滞后,PagingEnabled = true

Android中切换标签片段之间的延迟

从 URL 获取片段(哈希“#”后的值)[关闭]

如何将图像视图从改造加载的片段传递给子片段?