Подтвердить что ты не робот

Вызов 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 сразу после создания конструктора. Я с нетерпением жду улучшения этого кода, если вы дадите мне несколько советов.

4b9b3361

Ответ 1

Здесь вы узнаете, что вам нужно (API Facebook, как подождать, пока не будет выполнен графикRequest executeAsync). Как вы просите, для его использования сразу после создания конструктора замените .executeAsyc() на .executeAndWait().

Это не рекомендуется из-за замораживания основного потока и плохого пользовательского опыта.

Ответ 2

Вместо вызова. private static FacebookRequest fbRequest; Статически вы должны вызвать конструктор, таким образом ваш объект не будет пустым и в ответ на ответ, хранящийся в объекте, вы получите данные, а не null.