MediaPlayer的prepareAsync不回调onPrepared问题
一、问题排查
debug调试的framework日志信息:
根据日志,进入MediaPlayer的framework层看源码
STEP 1
先从
V/MediaPlayerNative: constructor
V/MediaPlayerNative: setListener
https://android.googlesource.com/platform/frameworks/av/+/master/media/libmedia/mediaplayer.cpp
可以看到这是正常的new了一个C++层的MediaPlayer
以及设置了一个Java层的弱引用给C++层的MediaPlayer监听,目前一切正常
STEP 2
再看后面的日志:
V/MediaPlayerNative: reset
......
V/MediaPlayerNative: setVideoSurfaceTexture
V/MediaPlayerNative: prepareAsync
可以看到这里对MediaPlayer的设置一切正常,没有异常。
包括后面通过url取获取HTTP流,以及获取大小都正常。
STEP 3
再看后面的日志:
V/PlayerBase: baseRelease() piid=679 state=1
......
发现MediaPlayer的父类PlayerBase居然被release了???
STEP 4
可以看到,这是MediaPlayer被系统给GC了。
V/MediaPlayerNative: setListener
disconnect
可以看到,这里是最后C++层的MediaPlayer也做了release
二、原因分析
通过debug调试日志,可以分析出问题出在MediaPlayer被JVM的GC调用了finalize。
三、解决办法
方案一
在调用MediaPlayer的prepareAsync后,开启一个异步延时线程,判断是否prepare成功,如果失败,则将MediaPlayer重置,在设置dataSource后再来一次prepare。
方案二
接入AOP框架,拦截MediaPlayer的finalize方法,在被GC系统调用前,记录状态改变。再做后续的重试处理。
考虑到AOP框架的大小,一般都上10M,如果考虑包体大小,可以采纳方案一,否则推荐方案二。
MediaPlayer的prepareAsync不回调onPrepared问题的更多相关文章
- Android(java)学习笔记180:Android MediaPlayer 播放prepareAsync called in state 8解决办法
使用android MediaPlayer播放音频文件时,有时会出现prepareasync called in state 8错误. 以下方法可以避免这个异常出现. 第一种方法: private ...
- Android(java)学习笔记123:Android MediaPlayer 播放prepareAsync called in state 8解决办法
1. 使用android MediaPlayer播放音频文件时,有时会出现prepareasync called in state 8错误. 以下方法可以避免这个异常出现. 第1种方法: priva ...
- 关于MediaPlayer的详细介绍
1)如何获得MediaPlayer实例:可以使用直接new的方式:MediaPlayer mp = new MediaPlayer();也可以使用create的方式,如:MediaPlayer mp ...
- 使用SurfaceView和MediaPlayer实现视频做为背景
场景:像我们在Uber应用开场,看到一一段视频作为開始.这样子让用户非常快投入应用使用的场景中去,这样的以视频作为开场的应用,我们是不是认为非常高大上呢,哈哈,事实上是使用了SerfaceView去载 ...
- 学习Android MediaPlayer
Android Media Playback 原文 The Android multimedia framework includes support for playing variety of c ...
- Android开发之Mediaplayer
Android提供了常见的音频.视频的编码.解码机制.借助于多媒体类MediaPlayer的支持,开发者能够非常方便在在应用中播放音频.视频.本篇博客主要解说在Android平台下怎样播放一个音频文件 ...
- Android--MP3播放器MediaPlayer
前言 Android提供了常见的音频.视频的编码.解码机制.借助于多媒体类MediaPlayer的支持,开发人员可以很方便在在应用中播放音频.视频.本篇博客主要讲解在Android平台下如何播放一个音 ...
- Android 视频播放器 (二):使用MediaPlayer播放视频
在 Android 视频播放器 (一):使用VideoView播放视频 我们讲了一下如何使用VideoView播放视频,了解了基本的播放器的一些知识和内容.也知道VideoView内部封装的就是Med ...
- Android MediaPlayer 基础简介
本文链接: Android MediaPlayer 基础简介 简单介绍MediaPlayer的基本概念,状态,常用的方法与监听器. 什么是MediaPlayer MediaPlayer类可以用来播放音 ...
随机推荐
- Python 04 Geany的安装和配置
安装原文:https://www.cnblogs.com/wongyi/p/7832567.html 配置原文:https://jingyan.baidu.com/album/154b46311ed9 ...
- Cocos Creator开发hello World
若本号内容有做得不到位的地方(比如:涉及版权或其他问题),请及时联系我们进行整改即可,会在第一时间进行处理. 请点赞!因为你们的赞同/鼓励是我写作的最大动力! 欢迎关注达叔小生的简书! 这是一个有质量 ...
- iis启动 服务无法在此时接受控制信息。 (异常来自 HRESULT:0x80070425)
问题描述:每隔一段时间应用程序池就会自动停止. 再次启动就报错:服务无法在此时接受控制信息. (异常来自 HRESULT:0x80070425) 处理办法:同时按下Win+R,运行“services. ...
- 微信小程序之网络通信
关于网络通信,这里我使用的是wx.request,官方代码示例如下: wx.request({ url: 'test.php', //仅为示例,并非真实的接口地址 data: { x: '', y: ...
- hadoop平台上HDFS和MAPREDUCE的功能、工作原理和工作过程
作业要求来源:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/3319 1.用自己的话阐明Hadoop平台上HDFS和MapReduce ...
- 第06组 Alpha事后诸葛亮
一.组长博客: https://www.cnblogs.com/mhq-mhq/p/11923194.html 二.Postmortem模板 设想和目标 1.我们的软件要解决什么问题?是否定义得很清楚 ...
- .Net Core NOPI操作word(一)
NOPI使用方式 1.安装nuget包 即可使用 Install-Package NPOI 一.创建word文档 //创建生成word文档 string path = "D:\\test.d ...
- Unity3d客户端与Photon服务器数据通信
今天先介绍一下Photon服务器是什么,可以做什么,为什么要使用它? Photon:开发多人联网游戏最轻松的方案!可以迅速简单实现多人实时在线网络游戏(pvp). Photon:透过位于各地的Phot ...
- 查询优化 In Oracle
Cost-based query transformation in Oracle Enhanced Subquery Optimizations in Oracle Cost-based query ...
- 搭建高可用rabbitmq集群及spring boot实现集群配置
java spring boot配置: //具体参看了配置的源码 org.springframework.boot.autoconfigure.amqp.RabbitProperties //Rabb ...