2013-06-19 63 views
0

希望這個職位將成爲誰運行到類似的問題,但這裏的人一個助手是我最近碰到的問題:Facebook登錄

我們推出我們自己的Facebook

背景登錄片段,並使其與3.0 sdk中的樣本相似。該片段是一個setRetainInstance(true)片段,並且預計來自facebook SDK的回調將被傳遞到有問題的片段。登錄過程將在片段的onCreate()方法被啓動時,像這樣:

if (sessionIsOpenable(session)) { 
     session.openForRead(new Session.OpenRequest(this).setCallback(mReadStatusCallback).setPermissions(mReadPermissions)); 
    } else if (SessionState.OPENING != session.getState()) { 
     Session.openActiveSession(getActivity(), this, true, mReadStatusCallback); 
    } 

問題遇到

這似乎只發生在第一次登錄/授權嘗試爲用戶, FB或我們的本地緩存中不存在緩存的訪問令牌。會出現什麼情況是,當用戶接受讀取權限請求,Facebook的SDK會叫我們的回調,而是因爲我們把守的額外的工作,像這樣我們的片段將不會進行任何額外的處理以支票:

if (isResumed()) { 
    // Do processing (adding fragments, etc...) 
} 

我們看到從暫停到恢復的片段轉換,但它是在片段的新實例上,而不是啓動登錄嘗試的實例。當我在調試過程中刪除了對isResumed()的檢查時,代碼會因未連接片段而崩潰。

的原因 ,我們發現的是,你絕對不能由於Facebook將推出它自己的活動執行從片段的onCreate()方法的會話初始化,這將導致片段的事被FragmentManager置爲非活動狀態(當我們的活動恢復時,會導致新的片段實例被添加到片段管理器中)。這是因爲FragmentManager做這個初始化片段時:

if (!f.mRetaining) { 
    f.performCreate(f.mSavedFragmentState); 
} 
    f.mRetaining = false; 

而接下來的過渡片段將使稱此:

if (!f.mRetaining) { 
    f.performDestroy(); 
} 

和碎片將不會被保留。我知道這是比較複雜的,但是它的要點是片段將被破壞,因爲它還沒有機會被完全激活。

回答

0

解決方法

我們已經有運行一個可運行的onResume()的能力,所以我們的onCreate添加的初始化代碼可運行(),並且可運行在被執行的onResume()。

mResumeRunnable = new Runnable() { 

     @Override 
     public void run() { 
      if (sessionIsOpenable(session)) { 
       session.openForRead(new Session.OpenRequest(AbstractFacebookLoginFragment.this) 
         .setCallback(mReadStatusCallback).setPermissions(mReadPermissions)); 
      } else if (SessionState.OPENING != session.getState()) { 
       Session.openActiveSession(getActivity(), AbstractFacebookLoginFragment.this, 
         true, mReadStatusCallback); 
      } 
    }; 

@Override 
public void onResume() { 
    super.onResume(); 

    if (null != mResumeRunnable) { 
     mResumeRunnable.run(); 
     mResumeRunnable = null; 
    } 
} 

希望這可以幫助有類似問題的人。