java - 从另一个应用程序切换回来后如何阻止我的应用程序崩溃?
问题描述
当我运行我的应用程序并按下主页按钮然后返回我的应用程序时,我收到 RunTimeException 和 IllegalStateException 错误。
我制作了一个简单的带有声音的 Android Alphabet 游戏,在游戏结束时,会显示时间量和不正确的数量,并使用 OK 按钮将用户返回到主屏幕。但是,当我按下主页按钮然后返回我的应用程序玩游戏时,在游戏结束时,只要用户单击确定,我就会在 Logcat 中收到 RunTimeException 和 IllegalStateException 错误并且游戏返回(假设它不是重新启动我的应用程序)到游戏的主页。我在这里查看了几篇帖子(如这里)并尝试了这些解决方案,但我仍然收到以下错误。我也是新手,不知道这些解决方案与我的代码有何关系。任何帮助是极大的赞赏。
/
/ Display the game over results dialog box
public void showGameOverDialog(){
ViewGroup viewGroup = findViewById(android.R.id.content);
View dialogView = LayoutInflater.from(this).inflate(R.layout.game_over_dialog, viewGroup, false);
dialog = new AlertDialog.Builder(this);
dialog.setView(dialogView);
TextView mTextView_Mistakes = dialogView.findViewById(R.id.textView_Mistakes);
String temp = getResources().getString(R.string.mistakes) + incorrectCount;
mTextView_Mistakes.setText(temp);
TextView mTextView_timeUsed = dialogView.findViewById(R.id.textView_timeUsedText);
String temp2 = getResources().getString(R.string.time_used) + mTimeUsed;
mTextView_timeUsed.setText(temp2);
final AlertDialog alertDialog = dialog.create();
final Intent intent = new Intent(this, MainActivity.class);
final Button btnReturnToHome = dialogView.findViewById(R.id.button_return_to_home);
btnReturnToHome.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mBackground.release();
mCorrect.release();
mWrong.release();
startActivity(intent);
finish(); // <-- put this based on a suggestion in a post in this website
}
});
alertDialog.show();
}
@Override
protected void onPause() {
super.onPause();
Log.wtf("OnPause is executed--------------------", "<----------");
mBackground.reset();
mCorrect.reset();
mWrong.reset();
}
@Override
protected void onResume() {
super.onResume();
Log.wtf("OnResume is executed--------------------", "<----------");
if (noResumeFirstTime){ // This makes sure that the following mediaplayers are not started here too.
Log.wtf("Music started on resume--------------------", "<----------");
mBackground.start(); // <-- Line 365 is here ------------------
mCorrect.start();
mWrong.start();
}
noResumeFirstTime = true;
}
该应用程序预计将毫无故障地返回主要活动,但我收到以下错误。
2019-07-28 22:11:58.925 12873-12873/com.example.alphabetsforkids E/lphabetsforkid: Unknown bits set in runtime_flags: 0x8000
2019-07-28 22:12:00.003 12873-12897/com.example.alphabetsforkids E/vndksupport: Could not load /vendor/lib/egl/libGLES_emulation.so from sphal namespace: dlopen failed: library "/vendor/lib/egl/libGLES_emulation.so" not found.
2019-07-28 22:12:00.004 12873-12897/com.example.alphabetsforkids E/libEGL: load_driver(/vendor/lib/egl/libGLES_emulation.so): unknown
2019-07-28 22:12:02.358 12873-12896/com.example.alphabetsforkids E/EGL_emulation: tid 12896: eglQueryString(923): error 0x3008 (EGL_BAD_DISPLAY)
2019-07-28 22:13:42.203 13035-13061/com.example.alphabetsforkids E/vndksupport: Could not load /vendor/lib/egl/libGLES_emulation.so from sphal namespace: dlopen failed: library "/vendor/lib/egl/libGLES_emulation.so" not found.
2019-07-28 22:13:42.203 13035-13061/com.example.alphabetsforkids E/libEGL: load_driver(/vendor/lib/egl/libGLES_emulation.so): unknown
2019-07-28 22:13:43.663 13035-13060/com.example.alphabetsforkids E/EGL_emulation: tid 13060: eglQueryString(923): error 0x3008 (EGL_BAD_DISPLAY)
2019-07-28 22:13:47.845 13035-13035/com.example.alphabetsforkids E/OnResume is executed--------------------: <----------
2019-07-28 22:14:00.320 13035-13035/com.example.alphabetsforkids E/OnPause is executed--------------------: <----------
2019-07-28 22:14:05.848 13035-13035/com.example.alphabetsforkids E/OnResume is executed--------------------: <----------
2019-07-28 22:14:05.882 13035-13035/com.example.alphabetsforkids E/Music started on resume--------------------: <----------
2019-07-28 22:14:05.925 13035-13035/com.example.alphabetsforkids E/MediaPlayerNative: start called in state 1, mPlayer(0x0)
2019-07-28 22:14:05.925 13035-13035/com.example.alphabetsforkids E/MediaPlayerNative: error (-38, 0)
2019-07-28 22:14:05.927 13035-13035/com.example.alphabetsforkids E/MediaPlayerNative: start called in state 1, mPlayer(0x0)
2019-07-28 22:14:05.928 13035-13035/com.example.alphabetsforkids E/MediaPlayerNative: error (-38, 0)
2019-07-28 22:14:05.929 13035-13035/com.example.alphabetsforkids E/MediaPlayerNative: start called in state 1, mPlayer(0x0)
2019-07-28 22:14:05.930 13035-13035/com.example.alphabetsforkids E/MediaPlayerNative: error (-38, 0)
2019-07-28 22:14:06.828 13035-13035/com.example.alphabetsforkids E/MediaPlayer: Error (-38,0)
2019-07-28 22:14:06.831 13035-13035/com.example.alphabetsforkids E/MediaPlayer: Error (-38,0)
2019-07-28 22:14:20.377 13035-13035/com.example.alphabetsforkids E/MediaPlayerNative: start called in state 0, mPlayer(0x0)
2019-07-28 22:14:23.544 13035-13035/com.example.alphabetsforkids E/MediaPlayerNative: start called in state 0, mPlayer(0x0)
2019-07-28 22:14:23.553 13035-13035/com.example.alphabetsforkids E/time is greater than best time: ----
2019-07-28 22:14:25.509 13035-13035/com.example.alphabetsforkids E/OnPause is executed--------------------: <----------
2019-07-28 22:14:25.521 13035-13035/com.example.alphabetsforkids E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.alphabetsforkids, PID: 13035
java.lang.RuntimeException: Unable to pause activity {com.example.alphabetsforkids/com.example.alphabetsforkids.AlphabetGame}: java.lang.IllegalStateException
at android.app.ActivityThread.performPauseActivityIfNeeded(ActivityThread.java:4306)
at android.app.ActivityThread.performPauseActivity(ActivityThread.java:4257)
at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:4209)
at android.app.servertransaction.PauseActivityItem.execute(PauseActivityItem.java:46)
at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:176)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1935)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7116)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:925)
Caused by: java.lang.IllegalStateException
at android.media.MediaPlayer._reset(Native Method)
at android.media.MediaPlayer.reset(MediaPlayer.java:2145)
at com.example.alphabetsforkids.AlphabetGame.onPause(AlphabetGame.java:365)
at android.app.Activity.performPause(Activity.java:7874)
at android.app.Instrumentation.callActivityOnPause(Instrumentation.java:1500)
at android.app.ActivityThread.performPauseActivityIfNeeded(ActivityThread.java:4296)
at android.app.ActivityThread.performPauseActivity(ActivityThread.java:4257)
at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:4209)
at android.app.servertransaction.PauseActivityItem.execute(PauseActivityItem.java:46)
at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:176)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1935)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7116)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:925)
2019-07-28 22:14:26.182 13144-13168/com.example.alphabetsforkids E/vndksupport: Could not load /vendor/lib/egl/libGLES_emulation.so from sphal namespace: dlopen failed: library "/vendor/lib/egl/libGLES_emulation.so" not found.
2019-07-28 22:14:26.182 13144-13168/com.example.alphabetsforkids E/libEGL: load_driver(/vendor/lib/egl/libGLES_emulation.so): unknown
2019-07-28 22:14:26.919 13144-13167/com.example.alphabetsforkids E/EGL_emulation: tid 13167: eglQueryString(923): error 0x3008 (EGL_BAD_DISPLAY)
解决方案
在浏览了所有互联网之后,我发现了与我的应用程序类似的东西并在我的代码中实现了它,现在它可以完美运行了。但是,自从更新 Android Studio 以来,我仍然无法在真实设备上运行它。现在需要看看那个。顺便说一句,以下是我对自己问题的解决方案。希望这对使用 AlertDialog 和媒体播放器并面临同样问题的其他人有所帮助。
@Override
protected void onPause() {
super.onPause();
Log.wtf("OnPause is executed--------------------", "<----------");
if(mBackground != null){
//mBackground.stop(); <<<----This was also in the code that I found online, but it was causing error for me so I after commenting, it worked.
mBackground.release();
mBackground = null;
}
if(mCorrect != null){
//mCorrect.stop();
mCorrect.release();
mCorrect = null;
}
if(mWrong != null){
//mWrong.stop();
mWrong.release();
mWrong = null;
}
}
@Override
protected void onResume() {
super.onResume();
Log.wtf("OnResume is executed--------------------", "<----------");
if (mBackground == null || !mBackground.isPlaying()){
Log.wtf("on resume---", "<---player null or not playing");
mBackground = MediaPlayer.create(AlphabetGame.this, R.raw.mursal_bensound_littleidea);
}
if (mBackground.isPlaying()){
Log.wtf("on resume---", "<---- player playing");
mBackground.stop();
mBackground.release();
mBackground = MediaPlayer.create(AlphabetGame.this, R.raw.mursal_bensound_littleidea);
}
if (mCorrect == null || !mCorrect.isPlaying()){
Log.wtf("on resume---", "<---player null or not playing");
mCorrect = MediaPlayer.create(AlphabetGame.this, R.raw.correct_choice);
}
if (mCorrect.isPlaying()){
Log.wtf("on resume---", "<---- player playing");
mCorrect.stop();
mCorrect.release();
mCorrect = MediaPlayer.create(AlphabetGame.this, R.raw.correct_choice);
}
if (mWrong == null || !mWrong.isPlaying()){
Log.wtf("on resume---", "<---player null or not playing");
mWrong = MediaPlayer.create(AlphabetGame.this, R.raw.wrong_choice);
}
if (mWrong.isPlaying()){
Log.wtf("on resume---", "<---- player playing");
mWrong.stop();
mWrong.release();
mWrong = MediaPlayer.create(AlphabetGame.this, R.raw.wrong_choice);
}
mBackground.start();
mCorrect.start();
mWrong.start();
}```
推荐阅读
- python - 分开 for - 循环到一个交替一个
- mysql - 动态更改记录的外键
- javascript - 在javascript中过滤数组中的重复字符
- c# - 创建 100 个变量
- apache - 如何根据 content-lenght 标头在开始时阻止文件上传
- php - 我可以使用 Wordpress 管理面板来更改我开发的网站吗?
- windows - CoRegisterClassObject 来自不同完整性级别或权限的访问类
- python - 为什么在 drf 中拒绝超级用户的权限?
- ruby - 如何将哈希键值对作为单个参数传递?
- javascript - 当我们的 self 函数作为 javascript 中的参数传递时发生了什么