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