Биометрическая подсказка в onResume выдает FragmentManager уже выполняет транзакции

Я намерен отображать биометрическую подсказку androidx всякий раз, когда пользователь возвращается к фрагменту после перехода от экрана. Для этого я разместил логику аутентификации на уровне фрагмента onResume. Он отлично работает при навигации в приложении. Но всякий раз, когда я перехожу к другому приложению и возвращаюсь или поворачиваю экран, приложение вылетает за исключением

java.lang.RuntimeException: Unable to resume activity {com.beekay.myapp/com.beekay.myapp.MainActivity}: java.lang.IllegalStateException: FragmentManager is already executing transactions
        at android.app.ActivityThread.performResumeActivity(ActivityThread.java:4205)
        at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:4237)
        at android.app.servertransaction.ResumeActivityItem.execute(ResumeActivityItem.java:52)
        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:2016)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7356)
        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:930)
     Caused by: java.lang.IllegalStateException: FragmentManager is already executing transactions
        at androidx.fragment.app.FragmentManager.ensureExecReady(FragmentManager.java:1778)
        at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1843)
        at androidx.fragment.app.FragmentManager.executePendingTransactions(FragmentManager.java:489)
        at com.beekay.myapp.MyFragment.onResume(MyFragment.kt:147)

Мой onResume код:

override fun onResume() {
        executor = ContextCompat.getMainExecutor(requireContext())

        val callback = object : BiometricPrompt.AuthenticationCallback() {

            override fun onAuthenticationError(errorCode: Int, errString: CharSequence) {
                super.onAuthenticationError(errorCode, errString)
                findNavController().popBackStack()
            }

            override fun onAuthenticationFailed() {
                super.onAuthenticationFailed()
                findNavController().popBackStack()
            }

            override fun onAuthenticationSucceeded(result: BiometricPrompt.AuthenticationResult) {
                super.onAuthenticationSucceeded(result)

//Continue the current work

            }
        }
        val activity = activity
        if (activity!=null) {
            val promptInfo = BiometricPrompt.PromptInfo.Builder()
                .setTitle("Investments")
                .setSubtitle("Place your finger on fingerprint scanner to view investments")
                .setNegativeButtonText("Cancel")
                .build()
            biometricPrompt = BiometricPrompt(requireActivity(), executor, callback)
            biometricPrompt.authenticate(promptInfo)
        }
super.onResume()
}

person Beekay    schedule 09.09.2020    source источник


Ответы (1)


Я решил проблему, вызвав биометрическую подсказку по фрагменту вместо активности.

Изменение было

biometricPrompt = BiometricPrompt(this, executor, callback)

вместо того

biometricPrompt = BiometricPrompt(requireActivity(), executor, callback)
person Beekay    schedule 12.09.2020
comment
Во фрагментах вы не можете использовать this, вы перемещаете это в activity из _3 _ ??! - person milad salimi; 19.10.2020