Kullanıcı bilgilerini almak için Facebook GraphRequest'i kullanıyorum ve Firebase'de ve ayrıca yerel olarak paylaşımlıPreferences'da saklamak için bu bilgileri kullanıyorum. Bu kod parçasıdır: -GraphRequest, executeAsync, Android: NullPointerException neden var?
public class Login extends AppCompatActivity {
Profile userProfile; /* Profile is a user-created class */
@Override
protected void onCreate(Bundle savedInstanceState) {
facebookLoginButton.registerCallback(facebookCallbackManager, new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
GraphRequest request = GraphRequest.newMeRequest(
loginResult.getAccessToken(),
new GraphRequest.GraphJSONObjectCallback() {
@Override
public void onCompleted(JSONObject object, GraphResponse response) {
String fullName,email;
try {
fullName=object.getString("name");
email = object.getString("email");
/* Initializing userProfile */
userProfile=new Profile(fullName,email);
firebaseReference.setValue(userProfile); //This works, which means userProfile is NOT null here
} catch (JSONException e) {
Log.d("JSONerror",e.toString());
}
}
});
Bundle parameters = new Bundle();
parameters.putString("fields", "id,name,email");
request.setParameters(parameters);
request.executeAsync();
saveProfileInfoLocally();
}
@Override
public void onCancel() {}
@Override
public void onError(FacebookException error) {}
});
void saveProfileInfoLocally(){
SharedPreferences sharedPrefs = getSharedPreferences("UserInfo", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPrefs.edit();
editor.putString("fullName",userProfile.getFullName()); //BUT this does NOT work, says userProfile is null
editor.apply();
}}
Ancak, ben saveProfileInfoLocally() içinde UserProfile detaylarını erişmeye çalıştığınızda, bu "Boş bir nesne başvurusu üzerine sanal yöntemi çağırmak için girişimde" diyerek bir NullPointerException atar. Lütfen bana neyin yanlış olduğunu ve bunu yapmanın en iyi yolunu söyle. Teşekkürler. Aslında profili getirir geri arama olduğunu yeni GraphRequest.GraphJSONObjectCallback() dışında saveProfileInfoLocally() çağrısı nedeniyle
Teşekkür ama ne anlamıyorum geçerli:
Aşağıdaki örnekte olduğu gibi callback'inde içindeki yöntem çağrısı hareket etmelidir ben başlatmış olmama rağmen – rdx
Başlamadıysanız :) Profil başlatılan kod geri aramada INSIDE idi. Ve bir geri arama, senkronize olmayan bir şey tanımlar. Anlamı şimdi olabilir, ya da şimdi 10 dakika içinde. Ancak, saveProfileInfoLocally() yöntemini, geri arama DIŞINDA çağırıyordunuz. Bu nedenle, kodunuz, GraphJSONObjectCallback'in tamamlanıp tamamlanmadığını bilmeden Profil nesnesini kaydetmeye çalışıyordu. Açıkçası, geri arama tamamlanmadı ve Profil boşaldı :) – Cbr
Bunu bir neden olarak düşündüm, ama bu hat - firebaseReference.setValue (userProfile) - değerinin ayarlandığını ve Firebase'in kullanıcıya gösterdiği gibi kafam karıştı veri tabanında. Bunun anlamı userProfile oluşturuldu ve boş değil. Doğrumuyum? – rdx