Android VideoView中SubtitleController Leak(泄漏)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android VideoView中SubtitleController Leak(泄漏)相关的知识,希望对你有一定的参考价值。

参考技术A 最近写一个含有视频播放的项目。为了方便就准备直接使用原生的VideoView

结果就在结束Activity的时候发生了泄漏,直接上图:

可以看到这边VideoView中的上下文引用导致整个Avtivity无法回收,原因是使用了SubtitleController方法,之前也查过网上的一些资料,全部千篇一律,都是6.0以前的AudioMessags泄漏,6.0以后被修复什么的,这个大一个内存泄漏我不知为什么网上一点有用的资源都没有,废话不多说,我们解决:

在VideoView中没有暴露设置这个SubtitleController的相关方法,所以我们只好从这个上下文对象入手。实例VideoView的时候传入的是Activity的上下文而VideoView里的SubtitleController方法中使用了HandlerThread,VideoView在stopPlayback()方法中又没有终止这个线程,这线程中还在使用Activity的上下文,导致了泄漏。

尽量不要将VideoView写在XML文件中! 动态实例VideoView,传入生命周期较长的Application对象,然后将对象添加至父布局。

如果要控制VideoView中的居中等布局属性效果,在父布局设置或者动态控制都可以,这个就不多说了

这样就不会出现大片的内存泄漏了,完成!

无法在android的videoview中播放来自url的视频如何在videoview中播放来自URL的视频?

【中文标题】无法在android的videoview中播放来自url的视频如何在videoview中播放来自URL的视频?【英文标题】:Unable to play video from url in videoview in android How to play video from URL in videoview? 【发布时间】:2020-07-14 10:55:22 【问题描述】:

我正在尝试使用VideoView 在android 中实现视频播放器。我在服务器上上传了视频我正在从服务器获取视频并尝试在VIdeoView 中播放我已成功获取视频但无法在播放器中播放。

下面是我的代码:

    MediaController mediacontroller = new MediaController(getActivity());
    mediacontroller.setAnchorView(videoView);

    videoView.setMediaController(mediacontroller);
   
    videoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() 
        @Override
        public void onCompletion(MediaPlayer mp) 
        
            videoView.setVideoURI(Uri.parse(video_url));
         
            videoView.start();
        
    );

    videoView.setOnErrorListener(new MediaPlayer.OnErrorListener() 
        @Override
        public boolean onError(MediaPlayer mp, int what, int extra) 

            Toast.makeText(getActivity(),"Error",Toast.LENGTH_SHORT).show();
            return false;
        
    );

有人请让我知道我做错了什么。任何帮助将不胜感激。

谢谢

【问题讨论】:

【参考方案1】:

在将媒体控制器设置为这样的视频视图之前,您还需要设置视频路径 url

Uri uri = Uri.parse(path);
           videoView.setVideoURI(uri);
           videoView.start();

示例

     videoView.setVideoURI(Uri.parse(video_url));       
      videoView.start();
     MediaController mediacontroller = new MediaController(getActivity());
        mediacontroller.setAnchorView(videoView);
    
        videoView.setMediaController(mediacontroller);
       ProgressBar progressBar =findViewById(R.id.progressbar);
        progressBar.setVisibility(View.VISIBLE);
        videoView.setOnCompletionListener(new     MediaPlayer.OnCompletionListener() 
            @Override
            public void onCompletion(MediaPlayer mp) 
            
               
            
        );
    
        videoView.setOnErrorListener(new MediaPlayer.OnErrorListener() 
            @Override
            public boolean onError(MediaPlayer mp, int what, int extra) 
    
                Toast.makeText(getActivity(),"Error",Toast.LENGTH_SHORT).show();
                return false;
            
        );
   videoView.setOnPreparedListener(new OnPreparedListener() 
            @Override
            public void onPrepared(MediaPlayer mp) 
                // TODO Auto-generated method stub
                mp.start();
                mp.setOnVideoSizeChangedListener(new OnVideoSizeChangedListener() 
                    @Override
                    public void onVideoSizeChanged(MediaPlayer mp, int arg1,
                            int arg2) 
                        // TODO Auto-generated method stub
                        progressBar.setVisibility(View.GONE);
                        mp.start();
                    
                );
            
        );

像这样在xml 中添加这个progressbar 小部件

<ProgressBar
        android:id="@+id/progressbar"
        android:layout_
        android:layout_
        android:layout_centerInParent="true"
        android:visibility="gone" />

更新:- 在播放视频时添加进度条

【讨论】:

更新代码,试试看,然后点击我的答案上的勾号图标确认

以上是关于Android VideoView中SubtitleController Leak(泄漏)的主要内容,如果未能解决你的问题,请参考以下文章

使用VideoView播放视频

Android开发之使用VideoView播放视频

android java中的圆角videoview

VideoView - Android 活动关闭

Android VideoView 在 stopPlayback() 后清除显示

Android - 使用 VideoView 缓冲滞后