2017-01-23 140 views
2

最新的Facebook SDK Android版4.17.0和4.18.0版本導致內存泄漏的日誌實現。有一種方法來註冊回調,但也應該有方法來取消註冊,例如onDestroy()方法。你知道如何註銷Facebook LoginButton執行回調嗎?註銷回調Facebook的登錄按鈕

我註冊Facebook的回調在的onCreate()這樣:

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

     } 
    }); 

我忘了提,按鈕沒有顯示在屏幕上,但我傳遞給它onclick事件我自定義按鈕。當它發生時,問題的原因就是那個奇怪的呼叫。將最終的溶液中除去mFacebookLoginBtn的並調用定製按鈕onClick事件:

LoginManager.getInstance().logInWithReadPermissions(this, Collections.singletonList("public_profile")); 
+0

Facebook SDK有一個'unregisterCallback(最終CallbackManager callbackManager)'方法。你試過了嗎? – saltandpepper

回答

1

用於這種內存泄漏的一種解決方法是不使用(內)匿名類。並利用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()); 
     } 
    } 
} 
+1

發生這種情況並沒有解決我的問題。但這是很好的做法,我非常喜歡。 – b2mob

0

您可以使用此代碼註銷或註銷Facebook的回調。 請把這個代碼註銷按鈕在那裏。

try { 
     if (AccessToken.getCurrentAccessToken() != null) { 
      LoginManager.getInstance().logOut(); 
     } 
} catch (Exception e1) { 
     e1.printStackTrace(); 
}