一、问题排查

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

https://android.googlesource.com/platform/frameworks/base/+/56a2301/media/jni/android_media_MediaPlayer.cpp?autodive=0%2F%2F%2F%2F%2F

以及设置了一个Java层的弱引用给C++层的MediaPlayer监听,目前一切正常

STEP 2

再看后面的日志:

V/MediaPlayerNative: reset
......
V/MediaPlayerNative: setVideoSurfaceTexture
V/MediaPlayerNative: prepareAsync

https://android.googlesource.com/platform/frameworks/base/+/56a2301/media/jni/android_media_MediaPlayer.cpp?autodive=0%2F%2F%2F%2F%2F

可以看到这里对MediaPlayer的设置一切正常,没有异常。

包括后面通过url取获取HTTP流,以及获取大小都正常。

STEP 3

再看后面的日志:

V/PlayerBase: baseRelease() piid=679 state=1
......

https://android.googlesource.com/platform/frameworks/base/+/master/media/java/android/media/PlayerBase.java

发现MediaPlayer的父类PlayerBase居然被release了???

https://android.googlesource.com/platform/frameworks/base/+/master/media/java/android/media/MediaPlayer.java

STEP 4

可以看到,这是MediaPlayer被系统给GC了。

V/MediaPlayerNative: setListener
disconnect

https://android.googlesource.com/platform/frameworks/base/+/56a2301/media/jni/android_media_MediaPlayer.cpp?autodive=0%2F%2F%2F%2F%2F

可以看到,这里是最后C++层的MediaPlayer也做了release

二、原因分析

通过debug调试日志,可以分析出问题出在MediaPlayer被JVM的GC调用了finalize

三、解决办法

方案一

在调用MediaPlayer的prepareAsync后,开启一个异步延时线程,判断是否prepare成功,如果失败,则将MediaPlayer重置,在设置dataSource后再来一次prepare。

方案二

接入AOP框架,拦截MediaPlayer的finalize方法,在被GC系统调用前,记录状态改变。再做后续的重试处理。

考虑到AOP框架的大小,一般都上10M,如果考虑包体大小,可以采纳方案一,否则推荐方案二。

最新文章

  1. Android6.0之来电转接号码显示修改
  2. Lua学习----Lua的表达式
  3. unp TCP 客户端服务器回射程序中对SIGCHLD信号的处理
  4. iOS学习之UIView
  5. document.write("\x3c\x54")?是加密了吗?
  6. 第33讲 UI组件_进度条ProcessBar和消息队列处理器handler
  7. 随着时间的推移:构造SDK路径错误(An error occurred while automatically activating bundle com.android.ide.eclipse.adt)
  8. graph使泳道图的label横向显示
  9. eclipse Maven构建的project无法公布lib到tomcat的解决方法
  10. IOS学习之路二十(程序json转换数据的中文字符问题解决)
  11. linux 简易启动脚本
  12. [转载] Java学习之Hessian通信基础
  13. 【译】基于主机的卡仿真(Host-based Card Emulation)
  14. HDU1171将多个不同价值不同数量的器材尽可能按等价值均分 第一份的价值尽可能的大 所以sum/2对第二份进行01背包 使其价值尽可能的大
  15. Linux文件系统命令 rm
  16. stark组件之搜索【模仿Django的admin】
  17. bzoj2286: [Sdoi2011]消耗战 虚树
  18. module.exports用法
  19. PHP-GTK的demo在windows下运行出现的问题
  20. 7.xamarin.android 发布签名与控制apk大小

热门文章

  1. java web项目改装exe安装版
  2. 捷配制作PCB流程
  3. 洛谷 P4822 [BJWC2012]冻结 题解
  4. Cocos CreatorUI系统下
  5. IDEA 重新 build Project
  6. Truncate使用注意事项
  7. avalon $computed不起作用?
  8. Linux环境下Nexus3.6安装
  9. koa post提交数据,koa-bodyparser中间件来获取post提交数据
  10. Kafka(四) —— KafkaProducer源码阅读