0

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

cevap

0

öyle. Hatta, neden bu "UserProfile" null diyor - yanıtı için

@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); 

          saveProfileInfoLocally(); 

          firebaseReference.setValue(userProfile); //This works, which means userProfile is NOT null here 
         } catch (JSONException e) { 
          Log.d("JSONerror",e.toString()); 
         } 
        } 
       }); 

    } 
+0

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

+0

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

+0

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