0

Guten Tag,speichern Informationen in Graph Anfrage Antwort

Ich mag würde die Information in einem List<String> die Werte speichern, die ich von Graph Request bekommen, aber wenn ich wieder die list, seine leer. Kann mir jemand helfen warum?

private List<String> getFriends(AccessToken accessToken) { 
    List<String> friendsName = new ArrayList<String>(); 
    GraphRequest requestt = 
      new GraphRequest(
        accessToken, 
        "/me/taggable_friends", 
        null, 
        HttpMethod.GET, 
        new GraphRequest.Callback() { 
         public void onCompleted(GraphResponse response) { 
         JSONObject obj = response.getJSONObject(); 
         JSONArray arr; 
         try { 
          arr = obj.getJSONArray("data"); 
          for (int l=0; l < arr.length(); l++) { 
           JSONObject oneByOne = arr.getJSONObject(l); 
           System.out.println(oneByOne.opt("name").toString()); 
           friendsName.add(oneByOne.opt("name").toString()); 

          } 
         } catch (JSONException e) { 
          e.printStackTrace(); 
         } 
         } 
        } 
      ); 

    Bundle parameters = new Bundle(); 
    parameters.putString("fields", "name"); 
    requestt.setParameters(parameters); 
    requestt.executeAsync(); 
    return friends; 
    } 

Antwort

1

Sie führen die Anfrage asynchron aus. Dies bedeutet, dass die Anfrage nicht sofort nach requestt.executeAsync(); ausgeführt wird, sondern irgendwann in der Nähe. Aus diesem Grund richten Sie den Callback im Konstruktor ein. Sie sollten Ihre friendsList in onCompleted Rückruf behandeln, anstatt es in getFriends zurückgeben.

Sie können die getFriends-Methode ändern, um GraphRequest.Callback als zweiten Parameter zu verwenden und nichts zurückgeben. So würde es mehr oder weniger wie folgt aussehen:

public void getFriends(AccessToken token, GraphRequest.Callback callback) { 
    GraphRequest requestt = new GraphRequest(token, "/me/taggable_friends", 
              null, HttpMethod.GET, callback); 
    Bundle parameters = new Bundle(); 
    parameters.putString("fields", "name"); 
    requestt.setParameters(parameters); 
    requestt.executeAsync(); 
} 

Und dann kann man es so nennen:

getFriends(accessToken, new GraphRequest.Callback() { 
       public void onCompleted(GraphResponse response) { 
       List<String> friendsName = new ArrayList<String>(); 
       JSONObject obj = response.getJSONObject(); 
       JSONArray arr; 
       try { 
        arr = obj.getJSONArray("data"); 
        for (int l=0; l < arr.length(); l++) { 
         JSONObject oneByOne = arr.getJSONObject(l); 
         System.out.println(oneByOne.opt("name").toString()); 
         friendsName.add(oneByOne.opt("name").toString()); 
        } 
        //CONSUME YOUR FRIENDS LIST HERE 
       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 
       } 
      } 
    ); 

Es wäre eine gute Idee, Ihre getFriends Methode getFriendsAsync

umbenennen Die bessere Idee wäre es, einen eigenen, spezifischeren Rückruf zu erstellen.

public interface FacebookFriendsCallback { 
    void onFriendsReceived(List<String> friendsNames); 
} 

Und es so verwenden:

public void getFriends(AccessToken token, FacebookFriendsCallback callback) { 
    List<String> friendsName = new ArrayList<String>(); 
    GraphRequest requestt = 
     new GraphRequest(
      accessToken, 
      "/me/taggable_friends", 
      null, 
      HttpMethod.GET, 
      new GraphRequest.Callback() { 
       public void onCompleted(GraphResponse response) { 
       JSONObject obj = response.getJSONObject(); 
       JSONArray arr; 
       try { 
        arr = obj.getJSONArray("data"); 
        for (int l=0; l < arr.length(); l++) { 
         JSONObject oneByOne = arr.getJSONObject(l); 
         System.out.println(oneByOne.opt("name").toString()); 
         friendsName.add(oneByOne.opt("name").toString()); 

        } 
        callback.onFriendsReceived(friendsName); 
       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 
       } 
      } 
    ); 
    Bundle parameters = new Bundle(); 
    parameters.putString("fields", "name"); 
    requestt.setParameters(parameters); 
    requestt.executeAsync(); 
} 

Und rufen Sie dann getFriends Methode:

getFriends(accessToken, new FacebookFriendsCallback() { 
    public void onFriendsReceived(List<String> friendsNames) { 
     //consume list here 
    } 
} 

Hinweis: Dies ist kein getestet, bereit zum Kopieren-Einfügen-Code. Eher die Idee für Ihre eigene Implementierung. Auch eine Fehlerbehandlung wäre erforderlich.

+0

wenn ich die FriendList innerhalb OnCompleted handle. Wie kann ich es außerhalb der getFriends-Methode bringen? Ursache Ich werde die Liste in der Methode verwenden, die die Methode getFriends aufruft. Danke – user3698799

+0

Sie können die Methode 'getFriends' ändern, um' GraphRequest.Callback' als Parameter zu verwenden und an die Anfrage zu übergeben. Siehe meine aktualisierte Antwort. – pkuszewski

Verwandte Themen