2017-10-13 3 views
10

Je fais une application qui nécessite d'obtenir des données de Facebook. Pour éviter la duplication de code, j'ai décidé de créer une classe pour GraphRequest.Appeler Facebook GraphRequest d'une autre classe renvoie null

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); 
}} 

Pour appeler la classe que j'utilise

private static FacebookRequest fbRequest; 
//.... 
JSONObject object= fbRequest.getGraphApi(path,token); 

Le problème est la méthode GraphApiRequest retourne toujours object=null et seulement après que la demande exécute.

Que devrais-je changer pour obtenir un objet réel sur appel?

EDIT: Merci à This answer

donc j'ai trouvé une solution pour objet sur appel, mais ce n'est pas l'option parfaite (peut-être même pas, puisque je ne suis pas très expérimenté dans la programmation, mais il fonctionne pour moi)

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; 
    } 
} 

Quand je demande l'appelant get exécuté après un certain temps

protected void onCreate(Bundle savedInstanceState) { 
    //... 
    FacebookRequest fbRequest = new FacebookRequest(path,token); 
    //... 
} 

Pour obtenir un objet réel sur appel j'utilise.

JSONObject object = fbRequest.getObject(); 

Il ne fonctionne toujours pas si je l'appelle pour un JSONObject juste après la création constructeur. Je suis impatient d'améliorer ce code, Si vous me donnez quelques conseils.

+0

Vous devez attendre la réponse (vous n'attendez pas de '.executeAsyc()'), puis utilisez getObject() si vous voulez obtenir l'objet * juste après la création du constructeur *. Cela peut être fait en remplaçant '.executeAsync()' par '.executeAndWait()' dans 'FacebookRequest'constructor –

Répondre

4

Ce que vous recherchez est expliqué ici (Facebook API how to wait til graphRequest executeAsync is done). Comme vous le demandez, pour l'utiliser juste après la création du constructeur remplacer .executeAsyc() avec .executeAndWait().

Ceci n'est pas conseillé en raison d'un blocage du thread principal et d'une mauvaise expérience utilisateur.

+0

Enfin, merci de m'avoir fourni ce lien. – Markus

+0

Oui @ Matteo vous avez raison j'ai eu aussi le même problème et j'ai résolu avec cette solution. –

1

pourquoi ne pas vous suivez https://developers.facebook.com/docs/android/graph/ cette documentation et utilisez cette méthode GraphRequest.newMeRequest()

+0

Ce que j'ai mentionné dans ma question était" Pour éviter la duplication du code, j'ai décidé de créer une classe pour GraphRequest. " Je n'ai aucun problème pour obtenir des données en activité. Ce que je veux réaliser est d'obtenir JSONObject de n'importe quelle classe, juste en appelant 'JSONObject object = fbRequest.getGraphApi (chemin, token); 'sans faire de nouvelle fonction de demande. – Markus

4

Au lieu d'appeler. private static FacebookRequest fbRequest; Statiquement, vous devriez appeler dans le constructeur, de cette façon votre objet ne sera pas nul et en retour de la réponse stockée dans l'objet, vous recevrez des données plutôt que null.