BiometricPrompt: утечка памяти биометрического фрагмента и активности - PullRequest
1 голос
/ 21 января 2020

Здравствуйте, я обнаружил 2 утечки памяти, которые я хотел бы устранить.

После получения обратного вызова onAuthenticationSucceeded(BiometricPrompt.AuthenticationResult result) я хочу setResult() и вызвать finish() в ActivityB на go обратно в ActivityA.
Хотя это работает нормально, похоже, что после вызова finish() это вызывает 2 утечки памяти.

2 скриншоты LeakCanary

Вот соответствующий код для воспроизведения утечки памяти (ActivityB):

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_b);;
    BiometricPrompt biometricPrompt = biometricPromptInstance();
    biometricPrompt.authenticate(buildPromptInfo());
}

private BiometricPrompt biometricPromptInstance(){
    Executor executor = ContextCompat.getMainExecutor(this);;
    BiometricPrompt.AuthenticationCallback callback = new BiometricPrompt.AuthenticationCallback() {
        @Override
        public void onAuthenticationError(int errorCode, @NonNull CharSequence errString) {

        }

        @Override
        public void onAuthenticationSucceeded(@NonNull BiometricPrompt.AuthenticationResult result) {
            setResult(RESULT_OK);

            //Causing leak:  ////////////////////////////////////////////////
            finish();
            /////////////////////////////////////////////////////////////////
        }

        @Override
        public void onAuthenticationFailed() {

        }
    };
    return new BiometricPrompt(this, executor, callback);
}

private BiometricPrompt.PromptInfo buildPromptInfo(){
    return new BiometricPrompt.PromptInfo.Builder()
            .setTitle("Login")
            .setSubtitle("Log in using your biometric credential")
            .setNegativeButtonText("Cancel")
            .build();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...