2016-08-21 62 views
1

我正在開發使用Facebook登錄的Android應用程序。登錄工作正常,我可以通過Facebook Graph API調用獲取信息。Facebook SDK阻止將字符串上傳到Firebase

我想上傳一個字符串到我的Firebase數據庫,並且字符串(標題爲parentFirstNameFromFacebook)是登錄Facebook的用戶的名字。我試圖最終在其setName()方法中用parentFirstNameFromFacebook上傳父對象。

doneCreatingNameAndPasswordFAB.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 

      gettingTextFromNameAndPasswordEditTexts(); 


      //region creating new Parent object and setting required variables 
      Parent coOpCreatingParent = new Parent(); 

      coOpCreatingParent.setCoopCreator(true); 
      coOpCreatingParent.setNumOfHoursOwned(0); 


      Bundle params = new Bundle(); 
      params.putString("fields", "id,first_name"); 
      new GraphRequest(AccessToken.getCurrentAccessToken(), "me", params, HttpMethod.GET, 
        new GraphRequest.Callback() { 
         @Override 
         public void onCompleted(GraphResponse response) { 

          if (response != null) { 
           try { 
            JSONObject data = response.getJSONObject(); 

            parentFirstNameFromFacebook = data.getString("first_name"); 

            SharedPreferences fBookSharedPref; 
            SharedPreferences.Editor editor; 

            fBookSharedPref = getSharedPreferences(Constants.FBOOK_NAME_SHARED_PREF, Context.MODE_PRIVATE); 
            editor = fBookSharedPref.edit(); 
            editor.putString(Constants.FBOOK_NAME_SHARED_PREF, parentFirstNameFromFacebook); 
            editor.apply(); 


           } catch (Exception e) { 
            e.printStackTrace(); 
           } 
          } 
         } 
        }).executeAsync(); 



      SharedPreferences fBookSharedPref = getSharedPreferences(Constants.FBOOK_NAME_SHARED_PREF, Context.MODE_PRIVATE); 

      fbookFirstNameForUpload = fBookSharedPref.getString(Constants.FBOOK_NAME_SHARED_PREF, null); 


      coOpCreatingParent.setName(fbookFirstNameForUpload); 


      getProfileImageUrlFromFBookGraph(); 

      coOpCreatingParent.setImageUrl(parentImageIDFromFBookGraph); 


      ArrayList<Child> newChildArrayList = new ArrayList<>(); 

      coOpCreatingParent.setChildren(newChildArrayList); 


      //endregion 

      //region creating new ArrayList<Parent> adding Parent object from above 
      ArrayList<Parent> coOpParentArrayList = new ArrayList<>(); 
      coOpParentArrayList.add(coOpCreatingParent); 
      //endregion 

      getReferenceOfCoOpBeingCreated(); 

      //region uploading entire new Co-Op object to Firebase 
      CoOp coOpObjectBeingUploaded = new CoOp(coOpKey, enteredNewCoOpPassword, enteredNewCoOpName, coOpParentArrayList); 
      referenceOfCoOp.setValue(coOpObjectBeingUploaded); 
      //endregion 

      //region going to AddChildren Activity with Co-Op key in intent 
      Intent intentForNewActivity = new Intent(getBaseContext(), AddChildrenActivity.class); 
      intentForNewActivity.putExtra(Constants.CO_OP_REFERENCE_TO_CHILD_ACTIVITY_KEY, coOpKey); 
      startActivity(intentForNewActivity); 
      //endregion 


     } 
    }); 

在下面的Firebase截圖中,parentsInCoOp是一個ArrayList,它下面的0是Parent對象。我試圖將名稱和Facebook URL字符串設置爲該Parent對象的其他變量。

Firebase screenshot

無論我做什麼,名字不上火力地堡現身!我不知道我做錯了什麼!

我也嘗試使用共享首選項,以防在Facebook調用的onCompleted()方法中設置parentFirstNameFromFacebook時出現問題。我把parentFirstNameFromFacebook放在SharedPref中,然後通過parent.setName()傳遞給它。

一旦我成功上傳名字,那麼我將爲fbook圖像URl字符串執行相同的過程。

任何人有任何建議?謝謝!

回答

1

您正在使用executeAsync()方法執行Facebook API GraphRequest。該請求在單獨的線程上處理,並且異步接收到響應。我沒有使用Facebook API,但我猜測這個請求需要與Facebook服務器進行通信,並且需要很多毫秒來提供響應。

其結果是,在回調的語句執行和喜好存儲的名稱之前這些語句

fbookFirstNameForUpload = 
    fBookSharedPref.getString(Constants.FBOOK_NAME_SHARED_PREF, null); 
coOpCreatingParent.setName(fbookFirstNameForUpload); 

執行。

+0

啊,我明白了。所以'.setName()'在Facebook響應到達之前運行。這意味着'.setName()'運行時'fbookFirstNameForUpload'爲空....這就是爲什麼名稱不會被添加到我的Firebase中的原因。我應該可以在'onComplete()'響應中運行'setName(fbookFirstNameForUpload)',對吧? – langsmith

+0

@langsmith:是的,您必須將取決於Facebook響應的代碼移入回調或在回調中調用它。 –