一、问题排查

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,如果考虑包体大小,可以采纳方案一,否则推荐方案二。

MediaPlayer的prepareAsync不回调onPrepared问题的更多相关文章

  1. Android(java)学习笔记180:Android MediaPlayer 播放prepareAsync called in state 8解决办法

    使用android MediaPlayer播放音频文件时,有时会出现prepareasync called in state 8错误. 以下方法可以避免这个异常出现.  第一种方法: private ...

  2. Android(java)学习笔记123:Android MediaPlayer 播放prepareAsync called in state 8解决办法

    1. 使用android MediaPlayer播放音频文件时,有时会出现prepareasync called in state 8错误. 以下方法可以避免这个异常出现.  第1种方法: priva ...

  3. 关于MediaPlayer的详细介绍

    1)如何获得MediaPlayer实例:可以使用直接new的方式:MediaPlayer mp = new MediaPlayer();也可以使用create的方式,如:MediaPlayer mp ...

  4. 使用SurfaceView和MediaPlayer实现视频做为背景

    场景:像我们在Uber应用开场,看到一一段视频作为開始.这样子让用户非常快投入应用使用的场景中去,这样的以视频作为开场的应用,我们是不是认为非常高大上呢,哈哈,事实上是使用了SerfaceView去载 ...

  5. 学习Android MediaPlayer

    Android Media Playback 原文 The Android multimedia framework includes support for playing variety of c ...

  6. Android开发之Mediaplayer

    Android提供了常见的音频.视频的编码.解码机制.借助于多媒体类MediaPlayer的支持,开发者能够非常方便在在应用中播放音频.视频.本篇博客主要解说在Android平台下怎样播放一个音频文件 ...

  7. Android--MP3播放器MediaPlayer

    前言 Android提供了常见的音频.视频的编码.解码机制.借助于多媒体类MediaPlayer的支持,开发人员可以很方便在在应用中播放音频.视频.本篇博客主要讲解在Android平台下如何播放一个音 ...

  8. Android 视频播放器 (二):使用MediaPlayer播放视频

    在 Android 视频播放器 (一):使用VideoView播放视频 我们讲了一下如何使用VideoView播放视频,了解了基本的播放器的一些知识和内容.也知道VideoView内部封装的就是Med ...

  9. Android MediaPlayer 基础简介

    本文链接: Android MediaPlayer 基础简介 简单介绍MediaPlayer的基本概念,状态,常用的方法与监听器. 什么是MediaPlayer MediaPlayer类可以用来播放音 ...

随机推荐

  1. Call to undefined function imagecreatefromjpeg() 让GD支持JPEG格式的图片扩展

    安装扩展支持jpeg格式: 第一步:首先下载文件: 版本v8: wget http://www.ijg.org/files/jpegsrc.v8b.tar.gz 版本v9: wget http://w ...

  2. 洛谷 P2212 [USACO14MAR]浇地Watering the Fields 题解

    P2212 [USACO14MAR]浇地Watering the Fields 题目描述 Due to a lack of rain, Farmer John wants to build an ir ...

  3. 【JZOJ6225】【20190618】计数

    题目 对于一个01串,定义\(f(s)\)为\(f(s) = \sum_{i=0}^{\lfloor \frac{|s|}{2} \rfloor -1 }[s_i=s_{|s|-1-i}]\) 定义\ ...

  4. I Count Two Three(打表+排序+二分查找)

    I Count Two Three 二分查找用lower_bound 这道题用cin,cout会超时... AC代码: /* */ # include <iostream> # inclu ...

  5. 【03NOIP普及组】栈(信息学奥赛一本通 1924)(洛谷 1044)

    #include<bits/stdc++.h> using namespace std; int n,ans,m,k,ans2; ],f[],d[][],num[][],tmp[],s[] ...

  6. java中&& 的运算优先级高于||

    public class First { public static void main(String[] args) { boolean a = false; boolean b = true; b ...

  7. rust 函数的使用

    fn main() { println!("Hello, world!"); another_function(2,3); let y ={ let x =3; //表达式的结尾没 ...

  8. IIS 7中添加FTP站点并设置指定用户访问

    1. 开启 FTP 和 IIS 服务功能:   2. 添加新用户: 打开计算机管理界面:   展开“本地用户与组”:   邮件点击“用户”->点击“创建新用户”:   在创建新用户对话框输入用户 ...

  9. IDEA把spring-boot项目打包成jar

    1.打开项目,然后右击项目选中‘Open Module Settings’进入project Structure( 快捷键 Ctrl+Shift+Alt+S或者File->Project Str ...

  10. java中JSON转含泛型对象

    public static void main(String[] args) { UserDto userDto=new UserDto("test","14" ...