Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 取消注册Facebook登录按钮的回调_Android_Facebook_Facebook Android Sdk - Fatal编程技术网

Android 取消注册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

4.17.0和4.18.0版本的最新Facebook Android SDK导致日志实现内存泄漏。有一种方法可以注册回调,但也应该有一种方法可以在例如onDestroy()方法中注销回调。您知道如何注销FacebookLoginButton实施的回调吗

我正在onCreate()中注册facebook回调,方法如下:

    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();
 }