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.
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
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