- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在尝试修复我的媒体播放器代码问题两周后,用户仍然报告崩溃,我束手无策,想看看我做错了什么。
在主类中初始化的媒体播放器和背景声音对象:
public class GameOver extends Activity{
public AdView adView;
BackgroundSound mBackgroundSound;
MediaPlayer mMediaPlayer;
这是我的媒体播放器代码和与之相关的方法,我没有在按下时调用任何东西:
public class BackgroundSound extends AsyncTask<Void, Void, Void> {
protected void onPreExecute() {
mMediaPlayer = MediaPlayer.create(GameOver.this, R.raw.welldone);
}
protected Void doInBackground(Void... params) {
mMediaPlayer.setVolume(100, 100);
mMediaPlayer.start();
mMediaPlayer.setLooping(true); // Set looping
return null;
}
protected void onCancelled(Void v) {
try {
mMediaPlayer.stop();
mMediaPlayer.reset();
mMediaPlayer.release();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
public void onPause() {
super.onPause();
mBackgroundSound.onCancelled((Void) null);
}
public void onResume() {
super.onResume();
mBackgroundSound = new BackgroundSound();
mBackgroundSound.execute((Void) null);
}
以下是一些崩溃示例:
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:200)
at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
at java.lang.Thread.run(Thread.java:1019)
Caused by: java.lang.IllegalStateException
at android.media.MediaPlayer.setVolume(Native Method)
at com.deucalion0.findtheanimal.Menu$BackgroundSound.doInBackground(Menu.java:235)
at com.deucalion0.findtheanimal.Menu$BackgroundSound.doInBackground(Menu.java:1)
at android.os.AsyncTask$2.call(AsyncTask.java:185)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
... 4 more
还有一个:
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:299)
at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
at java.util.concurrent.FutureTask.run(FutureTask.java:137)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
at java.lang.Thread.run(Thread.java:856)
Caused by: java.lang.IllegalStateException
at android.media.MediaPlayer.setLooping(Native Method)
at com.deucalion0.findtheanimal.Menu$BackgroundSound.doInBackground(Menu.java:234)
at com.deucalion0.findtheanimal.Menu$BackgroundSound.doInBackground(Menu.java:1)
at android.os.AsyncTask$2.call(AsyncTask.java:287)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
... 5 more
我阅读了许多 Stackoverflow 问题,试图理解 Google 文档,但我尝试过的所有方法似乎都是一个糟糕的解决方案。我不知道如何进行,有人可以指教吗?
最佳答案
为什么要以这种方式使用 AsyncTask?
它现在做什么:
什么是可行的解决方案:
编辑:这是我测试过的源代码,它对我有用(即使媒体播放器的准备时间真的很慢,并且 Activity 在加载前暂停):
private MediaPlayer mMediaPlayer;
private volatile boolean mMediaPlayerStopped ;
@Override
protected void onPause() {
Log.v("MusicTest", "Paused activity") ;
stopMediaPlayer();
super.onPause();
}
private void stopMediaPlayer() {
Log.v("MusicTest", "Stopping MediaPlayer") ;
mMediaPlayerStopped = true ;
if (mMediaPlayer != null) {
mMediaPlayer.stop() ;
mMediaPlayer.reset() ;
mMediaPlayer.release() ;
mMediaPlayer = null ;
}
}
private void startMediaPlayer() {
mMediaPlayerStopped = false ;
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
Log.v("MusicTest", "Creating MediaPlayer") ;
MediaPlayer mediaPlayer = MediaPlayer.create(MainActivity.this, R.raw.alarm10);
mediaPlayer.setVolume(100, 100) ;
mediaPlayer.setLooping(true) ;
Log.v("MusicTest", "Starting MediaPlayer") ;
mediaPlayer.start() ;
mMediaPlayer = mediaPlayer ;
if (mMediaPlayerStopped) {
Log.v("MusicTest", "MediaPlayer was stopped while preparing") ;
stopMediaPlayer();
}
return null;
}
}.execute();
}
@Override
protected void onResume() {
Log.v("MusicTest", "Resumed activity") ;
startMediaPlayer();
super.onResume();
}
关于Android 媒体播放器不断崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23425428/
如果这不是一个错误,那就是另一个错误。如果不是那样的话,那就是别的东西了。我觉得我的项目已经改变了很多,现在只是试图解决代码签名问题,结果一切都搞砸了。我严格按照说明进行操作,但出现错误,例如当前的“
我不确定是否有一些我不知道的内置变量或规则,或者 make 是否有问题,或者我只是疯了。 对于我的一个项目,我有一个如下的 makefile: CC=g++ CFLAGS=-O3 `libpng-co
我有大约 10 个 div,它们必须不断翻转,每个 div 延迟 3 秒 这个 codrops 链接的最后一个效果是我正在寻找的,但无需单击 div http://tympanus.net/Devel
我如何使用 jQuery 持续运行 PHP 脚本并每秒获取响应,以及将鼠标上的少量数据发送到同一脚本? 我真的必须添加一些随机扩展才能让这么简单的计时器工作吗? 最佳答案 To iterate is
JBoss 4.x EJB 3.0 我见过如下代码(大大简化): @Stateless @TransactionAttribute(TransactionAttributeType.NOT_SUPPO
使用 PHPStorm,我试图忽略每次尝试进行 git 提交时 pop 的 workspace.xml。 我的 .gitignore 看起来像: /.idea/ .idea/workspace.xml
我是一名优秀的程序员,十分优秀!