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(泄漏)的主要内容,如果未能解决你的问题,请参考以下文章