Firebase Android PhoneAuthProvider的java内存泄漏
Firebase->;PhoneAuthProvider->;VerifyPhoneNumber正在泄漏。我相信,这可能是OnVerificationStateChangedCallbacks,我们正在通过电话发送给verifyPhoneNumber
复制步骤:
- 启动应用程序
- 选择“PhoneAuthActivity”进行基于电话的身份验证
- 发送电话号码李>
- 点击后退李>
单击“上一步”时,会出现泄漏的内存
有人也有同样的问题吗?有解决办法吗
public void FirebasePhoneUser(String phoneNumber) {
mCallback = new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
@Override
public void onVerificationCompleted(PhoneAuthCredential phoneAuthCredential) {
Log.d("Completed","");
}
@Override
public void onVerificationFailed(FirebaseException e) {
Log.d("Error","");
}
@Override
public void onCodeSent(String verificationId,
PhoneAuthProvider.ForceResendingToken forceResendingToken) {
Log.d("onCodeSent", "");
}
};
phoneAuthProvider = PhoneAuthProvider.getInstance();
phoneAuthProvider.verifyPhoneNumber(
phoneNumber,
30,
TimeUnit.SECONDS,
TaskExecutors.MAIN_THREAD,
mCallback
);
}
# 1 楼答案
考虑到API很糟糕,而且没有取消订阅的选项,您有几个选项可以解决这个问题
OnVerificationStateChangedCallbacks
,将方法调用委托给另一个实例:我已经实现了
Closeable
来进行清理,但您可以实现RxJava的Disposable
或其他任何东西这里的使用模式是显而易见且众所周知的:
结果:Firebase泄漏了一个空的廉价
DelegatingVerificationStateCallbacks
的引用,而不是活动把你自己的引用置零。你可以采用上面介绍的方法来清除自己对活动的引用。这意味着这些引用必须是显式的,即类不能是匿名的,也不能是活动内部的。您必须完全控制类构造函数和字段,顶级类或嵌套的
static
类非常适合弱引用。这不太明确,而且涉及一些间接操作,但仍然有效:实例化顶级或嵌套的
static
类,将活动传递给构造函数,将其包装在WeakReference中,并分配给字段。仅此而已,一段时间后WeakReference#get
将开始返回null
反思。非常糟糕且不稳定的选择,在其他情况下可能会有所帮助。有时,您的活动可能会被Android SDK或特定于供应商的代码泄露,上述选项不适用。然后你可以自己清空一些私有字段。不要为Firebase这么做