0

Ich verwende Facebook GraphRequest, um Benutzerdetails abzurufen und diese Details dann in Firebase und lokal in sharedPreferences zu speichern. Dies ist das Stück Code: -GraphRequest, executeAsync, Android: Warum gibt es eine NullPointerException?

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(); 
}} 

aber wenn ich versuche, die Userprofile Details in saveProfileInfoLocally zuzugreifen(), eine Nullpointer wirft und sagte: „Versuch virtuelle Methode auf ein Null-Objekt Verweis aufrufen“. Bitte sagen Sie mir, was falsch ist und am besten, um es zu erledigen. Vielen Dank.

Antwort

0

Es ist, weil Sie Ihre saveProfileInfoLocally() aufrufen, außerhalb des neuen GraphRequest.GraphJSONObjectCallback() die der Rückruf ist, die tatsächlich das Profil abruft.

Sie sollten den Methodenaufruf innerhalb der Callback wie im folgenden Beispiel verschieben:

@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

Vielen Dank für die Antwort, aber was ich nicht verstehe, ist - Warum es sagt das „Userprofile“ ist null, auch obwohl ich es initialisiert habe? – rdx

+0

Weil Sie es nicht initialisiert haben :) Der Code, der das Profil initialisierte, war INSIDE der Rückruf. Und ein Callback definiert etwas, das asynchron passiert. Das bedeutet, dass es jetzt oder in 10 Minuten von jetzt an passieren kann. Aber Sie haben die saveProfileInfoLocally() - Methode außerhalb des Callbacks aufgerufen. Ihr Code hat also versucht, das Profilobjekt zu speichern, ohne zu wissen, ob der GraphJSONObjectCallback abgeschlossen wurde. Offensichtlich war der Rückruf nicht abgeschlossen und das Profil war null :) – Cbr

+0

Ich dachte dies als Grund, aber ich bin verwirrt, da diese Zeile - fireBaseReference.setValue (userProfile) - legt den Wert und Firebase zeigt den Benutzer Daten in seiner Datenbank. Das bedeutet, dass das userProfile erstellt wurde und es nicht null ist. Hab ich recht? – rdx

Verwandte Themen