Вызов Facebook GraphRequest из другого класса возвращает null
Я делаю приложение, которое требует получения данных из Facebook.
Чтобы избежать дублирования кода, я решил создать класс для GraphRequest.
public class FacebookRequest {
private static JSONObject object;
private FacebookRequest(JSONObject object) {
this.object = object;
}
private static JSONObject GraphApiRequest(String path, AccessToken token){
new GraphRequest(
token,
path,
null,
HttpMethod.GET,
new GraphRequest.Callback() {
public void onCompleted(GraphResponse response) {
object = response.getJSONObject();
}
}
).executeAsync();
return object;
}
public static JSONObject getGraphApi(String path, AccessToken token){
return GraphApiRequest(path, token);
}}
Для вызова класса я использую
private static FacebookRequest fbRequest;
//....
JSONObject object= fbRequest.getGraphApi(path,token);
Проблема GraphApiRequest
метод всегда возвращает object=null
и только после этого выполняет запрос.
Что я должен изменить, чтобы получить фактический объект при вызове?
EDIT:
Благодаря Этот ответ
Итак, я нашел решение для получения объекта по вызову, но это не идеальный вариант (возможно, даже неправильный, поскольку я не очень опытен в программировании, но он работает для меня)
public class FacebookRequest {
private JSONObject object;
public FacebookRequest(String path, AccessToken token) {
new GraphRequest(
token,
path,
null,
HttpMethod.GET,
new GraphRequest.Callback() {
public void onCompleted(GraphResponse response) {
object = response.getJSONObject();
}
}
).executeAsync();
}
public JSONObject getObject(){
return object;
}
}
Когда я вызываю запрос, он выполняется через некоторое время
protected void onCreate(Bundle savedInstanceState) {
//...
FacebookRequest fbRequest = new FacebookRequest(path,token);
//...
}
Чтобы получить фактический объект по вызову, который я использую.
JSONObject object = fbRequest.getObject();
Он по-прежнему не работает, если я вызываю JSONObject сразу после создания конструктора. Я с нетерпением жду улучшения этого кода, если вы дадите мне несколько советов.
Ответы
Ответ 1
Здесь вы узнаете, что вам нужно (API Facebook, как подождать, пока не будет выполнен графикRequest executeAsync).
Как вы просите, для его использования сразу после создания конструктора замените .executeAsyc()
на .executeAndWait()
.
Это не рекомендуется из-за замораживания основного потока и плохого пользовательского опыта.
Ответ 2
Вместо вызова. private static FacebookRequest fbRequest;
Статически вы должны вызвать конструктор, таким образом ваш объект не будет пустым и в ответ на ответ, хранящийся в объекте, вы получите данные, а не null.
Ответ 3
почему бы вам не следовать https://developers.facebook.com/docs/android/graph/ этой документации и использовать этот метод GraphRequest.newMeRequest()