我正在开发一个使用 Facebook 登录的 Android 应用程序。登录工作正常,我能够通过 Facebook Graph API 调用取回信息。
我正在尝试将一个字符串上传到我的 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 字符串设置为该父对象的其他变量。
无论我做什么,名称都不会显示在 Firebase 上!我不确定我做错了什么!
我还尝试使用共享首选项,以防在 Facebook 调用的 onCompleted() 方法中设置 parentFirstNameFromFacebook 时出现问题。我将 parentFirstNameFromFacebook 放在 SharedPref 中,然后将其取出以通过 parent.setName() 传递它。
成功上传名字后,我将对 fbook 图片 URl 字符串执行相同的过程。
有人有什么建议吗?谢谢!
最佳答案
您正在使用 executeAsync()
方法执行 Facebook API GraphRequest
。该请求在单独的线程上处理,并且异步接收 onComplete()
响应。我不使用 Facebook API,但我猜测请求需要与 Facebook 服务器通信,并且需要很多毫秒才能提供响应。
结果就是这些语句
fbookFirstNameForUpload =
fBookSharedPref.getString(Constants.FBOOK_NAME_SHARED_PREF, null);
coOpCreatingParent.setName(fbookFirstNameForUpload);
在回调中的语句执行之前执行并将名称存储在首选项中。
关于java - Facebook SDK 阻止将字符串上传到 Firebase,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39059875/