2014-02-13 86 views
7

我正在使用Facebook SDK,問題是FormSubmit函數運行了兩次。它被getView函數稱爲onCreateViewstatusCallback,如何解決它?爲什麼我的Facebook的android sdk登錄被調用兩次?

public class Home extends Fragment implements LoginListener { 
    public View rootView; 
    public ImageView HomeBg; 
    public ImageView buttonLoginLogout; 
    public TextView chi; 
    public TextView eng; 
    public ColorStateList oldColor; 
    public SharedPreferences prefs; 
    public EasyTracker tracker = null; 

    //Facebook login 
    private Session.StatusCallback statusCallback = new SessionStatusCallback(); 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 

     tracker = EasyTracker.getInstance(getActivity()); 
     prefs = getActivity().getSharedPreferences("memberData", 0); 

     getActivity().getActionBar().hide(); 

     rootView = inflater.inflate(R.layout.home, container, false); 
     buttonLoginLogout = (ImageView) rootView.findViewById(R.id.home_connectFB); 
     eng = (TextView) rootView.findViewById(R.id.btn_eng); 
     chi = (TextView) rootView.findViewById(R.id.btn_chi); 

     if (Utility.getLocale(getActivity()).equals("TC")) { 
      chi.setTextColor(getActivity().getResources().getColor(
        android.R.color.white)); 
      oldColor = eng.getTextColors(); 
     } else { 
      eng.setTextColor(getActivity().getResources().getColor(
        android.R.color.white)); 
      oldColor = chi.getTextColors(); 

     } 

     eng.setOnClickListener(setChangeLangListener("EN")); 
     chi.setOnClickListener(setChangeLangListener("TC")); 

     //Facebook login 
     Settings.addLoggingBehavior(LoggingBehavior.INCLUDE_ACCESS_TOKENS); 

     Session session = Session.getActiveSession(); 
     if (session == null) { 
      if (savedInstanceState != null) { 
       session = Session.restoreSession(getActivity(), null, statusCallback, savedInstanceState); 
      } 
      if (session == null) { 
       session = new Session(getActivity()); 
      } 
      Session.setActiveSession(session); 
      if (session.getState().equals(SessionState.CREATED_TOKEN_LOADED)) { 
       session.openForRead(new Session.OpenRequest(this).setCallback(statusCallback)); 
      } 
     } 

     updateView(); 

     return rootView; 
    } 

    @Override 
    public void onStart() { 
     super.onStart(); 
     Session.getActiveSession().addCallback(statusCallback); 
     tracker.set(Fields.SCREEN_NAME, "Landing Page " + Utility.getLocale(getActivity())); 
     tracker.send(MapBuilder.createAppView().build()); 
    } 

    @Override 
    public void onStop() { 
     super.onStop(); 
     Session.getActiveSession().removeCallback(statusCallback); 
     EasyTracker.getInstance(getActivity()).activityStop(getActivity()); 
    } 

    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     Session.getActiveSession().onActivityResult(getActivity(), requestCode, resultCode, data); 
    } 

    @Override 
    public void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     Session session = Session.getActiveSession(); 
     Session.saveSession(session, outState); 
    } 

    private void updateView() { 
     Session session = Session.getActiveSession(); 
     if (session.isOpened()) { 
      // get request 

      if (!session.getAccessToken().equals(prefs.getString("token", ""))) 
       new FormSubmit(getActivity(),this,tracker).execute("login", session.getAccessToken()); 
      else 
       onTaskComplete(prefs.getString("token", ""),prefs.getString("memberId", "")); 

     } else { 
      buttonLoginLogout.setImageResource(R.drawable.landing_btn_connect_facebook); 
      buttonLoginLogout.setOnClickListener(new View.OnClickListener() { 
       public void onClick(View view) { onClickLogin(); } 
      }); 
     } 
    } 

    private void onClickLogin() { 
     Session session = Session.getActiveSession(); 
     if (!session.isOpened() && !session.isClosed()) { 
      session.openForRead(new Session.OpenRequest(this).setCallback(statusCallback)); 
     } else { 
      Session.openActiveSession(getActivity(), this, true, statusCallback); 
     } 
    } 

    private class SessionStatusCallback implements Session.StatusCallback { 
     @Override 
     public void call(Session session, SessionState state, Exception exception) { 
      updateView(); 
     } 
    } 

    public OnClickListener setChangeLangListener(final String lang) { 
     OnClickListener changeLangListener = new OnClickListener() { 
      @Override 
      public void onClick(View arg0) { 
       Configuration config = new Configuration(getResources().getConfiguration()); 

       if (Utility.getLocale(getActivity()).equals("TC") && lang.equals("EN")) { 
        tracker.send(MapBuilder.createEvent("menu_click","language", "switchEN", null).build()); 
        config.locale = Locale.ENGLISH; 
        chi.setTextColor(oldColor); 
        eng.setTextColor(getActivity().getResources().getColor(
          android.R.color.white)); 
       } else if (Utility.getLocale(getActivity()).equals("EN") && lang.equals("TC")) { 
        tracker.send(MapBuilder.createEvent("menu_click","language", "switchTC", null).build()); 
        config.locale = Locale.TRADITIONAL_CHINESE; 
        eng.setTextColor(oldColor); 
        chi.setTextColor(getActivity().getResources().getColor(
          android.R.color.white)); 
       } 

       getResources().updateConfiguration(config,getResources().getDisplayMetrics()); 

       onConfigurationChanged(config); 
      } 
     }; 
     return changeLangListener; 
    } 

    @Override 
    public void onConfigurationChanged(Configuration newConfig) { 
     super.onConfigurationChanged(newConfig); 
     Intent intent = getActivity().getIntent(); 
     intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); 
     getActivity().finish(); 
     startActivity(intent); 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
     AppEventsLogger.activateApp(getActivity(),getResources().getString(R.string.app_id)); 
    } 

    @Override 
    public void onTaskComplete(String token, String memberId) { 
     Toast.makeText(getActivity(), "t:" + token + "m:" + memberId, Toast.LENGTH_LONG).show(); 

     buttonLoginLogout.setImageResource(R.drawable.landing_btn_take_a_selfie); 
     buttonLoginLogout.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View view) { 
       ((LandingPage)getActivity()).tabHost.setCurrentTab(2); 
      } 
     }); 
    } 

    @Override 
    public void onTaskFailure(String errorMsg) { 
     Toast.makeText(getActivity(), errorMsg, Toast.LENGTH_LONG).show(); 
    } 

    public void saveMemberInfo(String token, String memberId){ 
     SharedPreferences.Editor editor = prefs.edit(); 
     editor.putString("token", token); 
     editor.putString("memberId", memberId); 
     editor.commit(); 
    } 

} 
+1

所有的HTML請求都有響應,如果這是連接到Facebook,很可能你得到了Reponse + Postback,這會讓你的事件觸發兩次。我對Facebook SDK不熟悉,但我會看看你正在使用的函數的API。 – Mike

+0

非常感謝,我按照文件夾sample/SessionLoginSample – user782104

回答

5

更新您的SessionStatusCallback()方法,如下所示,並檢查輸出。

如果有效,那麼將其標記爲可接受的答案。當你的會話正從一個狀態變爲另一個

private class SessionStatusCallback implements Session.StatusCallback { 
    @Override 
    public void call(Session session, SessionState state, Exception exception) { 
     if (session.isOpened()) { 
      updateView(); 
     } 
    } 
} 

SessionStatusCallback()方法稱爲每次。

在Facebook上登錄之前,你的SessionState是SessionState.CLOSED。當您嘗試在Facebook上登錄並且身份驗證步驟成功後,您的會話更改爲SessionState.OPENING,這次您的SessionStatusCallback()方法得到執行。

但是在目前的情況下你的會話並沒有完全打開,它正在打開。因此,此後當您的會話完全打開時,會話狀態更改爲SessionState.OPENED,因此您的SessionStatusCallback()方法再次被調用。

這就是爲什麼改變你的SessionStatusCallback()方法,如上所述,它會很好地工作。

+0

中的facebook sdk提供的sdk示例發生此問題,因爲您添加了一個調用updateView()的偵聽器,但此示例已在OnCreate()中調用updateView()。你可以用兩種方法來劃分它,並且如果@Vivek Bansal聲明成立,可能會做出你想要的。 – sagits

0

我認爲你運行兩次相同的請求。

刪除

updateView(); 

從的onCreate當statusCallback被觸發

1

您嘗試在onCreateView()恢復/開,盤中它總要被調用。所以當會話準備就緒時,你的回調被調用,因此調用updateView()

快速解決方法是撥打updateView()onResume()而不是onCreateView()。然後,在updateView()內部,如果isAdded()返回false,請立即檢查並返回。因爲在這種情況下,updateView()在視圖尚未準備就緒時由您的回調調用。請以FB SDK中的UserSettingsFragment爲例:https://github.com/facebook/facebook-android-sdk/blob/master/facebook/src/com/facebook/widget/UserSettingsFragment.java#L370

此外,我會嘗試加載會話onActivityCreated()而不是onCreateView()以確保活動已創建並準備就緒。 https://github.com/facebook/facebook-android-sdk/blob/master/facebook/src/com/facebook/widget/FacebookFragment.java

相關問題