Android 取消注册Facebook登录按钮的回调
4.17.0和4.18.0版本的最新Facebook Android SDK导致日志实现内存泄漏。有一种方法可以注册回调,但也应该有一种方法可以在例如onDestroy()方法中注销回调。您知道如何注销FacebookLoginButton实施的回调吗 我正在onCreate()中注册facebook回调,方法如下:Android 取消注册Facebook登录按钮的回调,android,facebook,facebook-android-sdk,Android,Facebook,Facebook Android Sdk,4.17.0和4.18.0版本的最新Facebook Android SDK导致日志实现内存泄漏。有一种方法可以注册回调,但也应该有一种方法可以在例如onDestroy()方法中注销回调。您知道如何注销FacebookLoginButton实施的回调吗 我正在onCreate()中注册facebook回调,方法如下: mCallbackManger = CallbackManager.Factory.create(); mFacebookLoginBtn.setReadPermi
mCallbackManger = CallbackManager.Factory.create();
mFacebookLoginBtn.setReadPermissions("public_profile");
mFacebookLoginBtn.registerCallback(mCallbackManger, new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
Timber.d("Facebook login success %s", loginResult.toString());
showProgressDialog();
getPresenter().loginWithFacebook(loginResult.getAccessToken());
}
@Override
public void onCancel() {
Timber.d("Facebook login cancel");
}
@Override
public void onError(FacebookException error) {
Timber.d("Facebook login error %s", error.toString());
}
});
这种内存泄漏的解决方法是不使用(内部)匿名类。并利用
WeakReference
// Fragment or whatever your class is...
class MyFragment extends Fragment {
public [...] {
mCallbackManger = CallbackManager.Factory.create();
mFacebookLoginBtn.setReadPermissions("public_profile");
mFacebookLoginBtn.registerCallback(mCallbackManger, new MyFragment.FBCallback(this));
}
// New static class (not inner)
static class FBCallback implements FacebookCallback<LoginResult> {
private WeakReference<MyFragment> fragmentRef;
public FBCallback(MyFragment fragment) {
fragmentRef = new WeakReference<>(fragment)
}
@Override
public void onSuccess(LoginResult loginResult) {
Timber.d("Facebook login success %s", loginResult.toString());
MyFragment fragment = fragmentRef.get()
if (fragment != null) {
fragment.showProgressDialog();
fragment.getPresenter().loginWithFacebook(loginResult.getAccessToken());
}
}
@Override
public void onCancel() {
Timber.d("Facebook login cancel");
}
@Override
public void onError(FacebookException error) {
Timber.d("Facebook login error %s", error.toString());
}
}
}
//片段或你的类是什么。。。
类MyFragment扩展了片段{
公共[……]{
mCallbackManger=CallbackManager.Factory.create();
mFacebookLoginBtn.setReadPermissions(“公共配置文件”);
mFacebookLoginBtn.registerCallback(mCallbackManger,newmyfragment.FBCallback(this));
}
//新静态类(非内部)
静态类FBCallback实现FacebookCallback{
私有软引用片段ref;
公共FBCallback(MyFragment片段){
fragmentRef=新的组织引用(片段)
}
@凌驾
成功时公共无效(LoginResult LoginResult){
Timber.d(“Facebook登录成功%s”,loginResult.toString());
MyFragment fragment=fragmentRef.get()
if(片段!=null){
fragment.showProgressDialog();
fragment.getPresenter().loginWithFacebook(loginResult.getAccessToken());
}
}
@凌驾
公开作废{
Timber.d(“Facebook登录取消”);
}
@凌驾
public void onError(facebook异常错误){
Timber.d(“Facebook登录错误%s”,错误.toString());
}
}
}
您可以使用此代码注销或注销facebook回调。
请把这个代码放在有注销按钮的地方
try {
if (AccessToken.getCurrentAccessToken() != null) {
LoginManager.getInstance().logOut();
}
} catch (Exception e1) {
e1.printStackTrace();
}
这并没有解决我遇到的问题。但是这是一个很好的实践,我非常喜欢它。Facebook SDK有一个方法
unregisterCallback(final CallbackManager CallbackManager)
。你试过了吗?
try {
if (AccessToken.getCurrentAccessToken() != null) {
LoginManager.getInstance().logOut();
}
} catch (Exception e1) {
e1.printStackTrace();
}