Выполняется запрос асинхронно. Это означает, что запрос не будет выполнен сразу после requestt.executeAsync();
, но в ближайшем будущем. Вот почему вы настраиваете обратный вызов в конструкторе. Вы должны обработать свой friendsList
в обратном вызове onCompleted
вместо его возврата в getFriends
.
Вы можете изменить метод getFriends
, чтобы принять GraphRequest.Callback
в качестве второго параметра и не возвращать его. Так это будет выглядеть более или менее так:
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();
}
И тогда вы можете назвать это так:
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();
}
}
}
);
Было бы хорошей идеей переименовать метод getFriends
в getFriendsAsync
Лучшей идеей было бы создать свой собственный, более определенный обратный вызов.
public interface FacebookFriendsCallback {
void onFriendsReceived(List<String> friendsNames);
}
И использовать его так:
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();
}
И затем вызвать метод getFriends
:
getFriends(accessToken, new FacebookFriendsCallback() {
public void onFriendsReceived(List<String> friendsNames) {
//consume list here
}
}
Примечание: это не испытанный, готовый для копирования-вставки кода. Скорее, идея для вашей собственной реализации. Также потребуется некоторая обработка ошибок.
если я обрабатываю friendList внутри onCompleted. Как я могу вывести его за пределы метода getFriends? Потому что я буду использовать список в методе, вызывающем метод getFriends. Спасибо – user3698799
Вы можете изменить метод 'getFriends', чтобы взять параметр« GraphRequest.Callback »в качестве параметра и передать его в запрос. См. Мой обновленный ответ. – pkuszewski