IllegalStateException เมื่อเพิ่มส่วนเพื่อตอบสนองต่อการล็อกหน้าจอ

ประการแรก ฉันเชื่อว่านี่ไม่ใช่คำถามที่ซ้ำกัน แม้ว่าจะมีการถามวิธีแก้ไขข้อผิดพลาดหลายครั้งก็ตาม ฉันได้ลองใช้วิธีแก้ไขปัญหาที่แตกต่างกันอย่างน้อย 5 วิธี แต่ก็ไม่ได้เปลี่ยนแปลงอะไรหรือทำให้สิ่งต่าง ๆ แย่ลง ฉันต้องการหยุดกิจกรรมชั่วคราวเมื่อหน้าจอถูกล็อค/เปลี่ยนโฟกัส และอนุญาตให้ผู้ใช้ยกเลิกการหยุดกิจกรรมชั่วคราวเมื่อเปิดแอปอีกครั้ง

public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    if (!hasFocus && pauseFragment == null) {
        exercisePlayPause(isPaused, workoutExerciseNum);
        isPaused = !isPaused;
    }
}

การออกกำลังกายPlayPause เรียกวิธีการต่อไปนี้

public void PassExerciseNum(int exerciseNum, Boolean isPaused) {
    if (!isPaused) {
        pauseFragment = new PauseFragment();
        pauseFragment.getExNum(exerciseNum);
        getFragmentManager().beginTransaction().add(R.id.aworkout_layout, pauseFragment, "pause").commit();
    } else {
        getFragmentManager().beginTransaction().remove(pauseFragment).commit();
        pauseFragment = null;
        exercisePlayPause(true, exerciseNum);
    }
}

วิธีนี้ใช้ได้ผลดีเมื่อกดปุ่มโฮมหรือเปิดใช้งานแอปอื่น ๆ หรือคลิกแถบการแจ้งเตือน แต่เมื่อหน้าจอถูกล็อค ฉันได้รับข้อผิดพลาดดังต่อไปนี้

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
                                                                      at android.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1411)
                                                                      at android.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1429)
                                                                      at android.app.BackStackRecord.commitInternal(BackStackRecord.java:687)
                                                                      at android.app.BackStackRecord.commit(BackStackRecord.java:663)

เส้นที่ละเมิดคือ getFragmentManager().beginTransaction().add(R.id.aworkout_layout ฉันกำลังหยุดกระบวนการบางอย่างชั่วคราวเมื่อมีเหตุการณ์ใดๆ ที่ทำให้ผู้ใช้ออกจากแอป และเมื่อผู้ใช้กลับมาที่แอป เขา/เธอก็สามารถกลับมาทำงานต่อจากที่นั่นได้ ข้าพเจ้าจึงไม่ทำลายกิจกรรม ฉันได้ลองใช้ commitAllowingStateLoss() แล้ว แต่นั่นทำให้ฉันสูญเสียข้อมูลสำหรับกระบวนการที่หยุดชั่วคราว และทำให้เลอะเทอะเล็กน้อย

ในระยะสั้นคำถามคือจะทำให้ธุรกรรมแฟรกเมนต์เกิดขึ้นได้อย่างไรก่อนที่ onSaveInstanceState จะถูกทริกเกอร์เมื่อกดปุ่มล็อคหน้าจอ


person suku    schedule 18.05.2016    source แหล่งที่มา


คำตอบ (1)


การวางแนวของกิจกรรมคือ sensorLandscape เมื่อล็อคหน้าจอ หน้าจอจะแปลงหน้าจอเป็นแนวตั้ง และเมื่อปลดล็อคหน้าจอ หน้าจอจะเริ่มต้นจากโหมดแนวตั้งแล้วเปลี่ยนเป็นแนวนอน ดังนั้น onDestroy จึงถูกเรียกเมื่อหน้าจอถูกล็อค และเมื่อปลดล็อคหน้าจอแล้ว onCreate จะถูกเรียก การเปลี่ยนแปลงการวางแนวนี้จะแทนที่การวางแนวของกิจกรรมที่ตั้งไว้ในรายการ จะเกิดอะไรขึ้นเมื่อการวางแนวที่รุนแรงนี้เกิดขึ้นสามารถควบคุมได้โดยการเพิ่ม android:configChanges="orientation|screenSize|keyboardHidden"/> ลงในไฟล์ Manifest สิ่งนี้จะป้องกันไม่ให้มีการเรียก onDestroy และ "illegalStateException" สามารถหลีกเลี่ยงได้

person suku    schedule 19.05.2016