经过大量的调试后我终于找到了导致此错误的原因!垃圾收集!
我在媒体视图中播放视频,在后台我正在寻找来自Rest API的新视频.
我偶尔会看到垃圾收集运行:
02-22 13:14:57.969: D/dalvikvm(16888): GC_EXPLICIT freed 152K, 4% free 6746K/6979K, paused 2ms+2ms
Run Code Online (Sandbox Code Playgroud)
直到那之后:
02-22 13:14:57.969: W/MediaPlayer-JNI(16888): MediaPlayer finalized without being released
Run Code Online (Sandbox Code Playgroud)
所以我每隔5秒就调用一次System.gc()来测试它.
一旦第一个GC被调用就会发生!
02-22 13:19:47.813: D/dalvikvm(17060): GC_EXPLICIT freed 167K, 5% free 6745K/7047K, paused 2ms+2ms ---- I call GC
02-22 13:19:47.813: W/MediaPlayer-JNI(17060): MediaPlayer finalized without being released ---- VIDEO PLAY INTERRUPTED
Run Code Online (Sandbox Code Playgroud)
为什么会这样?我能预防吗?
播放视频:
private void playMedia(int playListIndex) throws IOException {
File mediadir = getDir("tvr", Context.MODE_PRIVATE);
filelist = mediadir.listFiles();
Log.i("media player", "play media!");
String path = filelist[playListIndex].getAbsolutePath();
FileInputStream fileInputStream …Run Code Online (Sandbox Code Playgroud) 在我的应用程序中,我使用MediaPlayer API 创建了一个音频播放器(仅限WAV文件).但是玩家每次都不会给onCompletion Listener回调.有时它会给出回调但不是每次都回调.我正在对wav文件进行一些音频处理,比如插入和覆盖.
是因为音频标题中有任何缺失吗?回放完成后为什么不回调?
我在我的父类中发布了一个MediaPlayer成员变量,在我启动之后,它不会调用onCompletion,或者至少onCompletionListener没有捕获它?我的代码看起来有点效果
mediaPlayer = Mediaplayer.create(this, currentSample);
mediaPlayer.start();
Run Code Online (Sandbox Code Playgroud)
代码中的其他地方是我的onCompletionListener
mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
public void onCompletion(MediaPlayer mp) {
if (repeatFlag == true) {
handler.removeCallbacks(sampleRunnable);
handler.postDelayed(sampleRunnable, delay);
}
}
});
Run Code Online (Sandbox Code Playgroud)
我正在使用处理程序来调用sampleRunnable,因为我想以指定的延迟间隔循环它.但是,onCompletion似乎永远不会被调用.我对此非常肯定,因为我在onCompletion中设置了断点,它永远不会暂停程序,我试图单步执行它似乎永远不会被调用.有任何想法吗?