从另一个应用切换回后如何阻止我的应用崩溃?

时间:2019-07-29 02:59:45

标签: java android crash runtimeexception

当我运行我的应用程序并按主页按钮,然后返回到我的应用程序时,出现RunTimeException和IllegalStateException错误。

我制作了一个简单的带有声音的Android Alphabet游戏,在游戏结束时,用确定按钮显示时间和不正确的次数,以使用户返回主屏幕。但是,当我按下主页按钮然后返回我的应用程序以玩游戏时,在游戏结束时,只要用户单击“确定”,我就会在Logcat中收到RunTimeException和IllegalStateException错误,并且游戏会返回(假设不是重新启动我的应用))。我在这里查看了几篇文章(例如here)并尝试了这些解决方案,但仍然收到以下错误。我也是新手,也不知道这些解决方案与我的代码有什么关系。任何帮助将不胜感激。

/

/ 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)

2 个答案:

答案 0 :(得分:0)

您是否在实际设备而不是模拟器上尝试过您的应用程序?我注意到您的GLES库无法加载,对于您的情况我不是100%的,但是GLES通常无法在模拟器上正常工作。

答案 1 :(得分:0)

耕种所有互联网之后,我发现了与我的应用类似的东西并在代码中实现了它,现在它可以完美运行了。但是,自从更新Android Studio之后,我仍然无法在真实设备上运行它。现在需要看一下。顺便说一句,下面是我对自己的问题的解决方案。希望这对使用AlertDialog和Media Player并面临相同问题的其他人有所帮助。

@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();

    }```