2017-10-13 53 views
10

我正在製作需要從Facebook獲取數據的應用程序。 爲了避免重複代碼,我決定爲GraphRequest創建一個類。從另一個類中調用Facebook GraphRequest返回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); 
}} 

要調用類的我用

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

問題是GraphApiRequest方法總是返回object=null,只執行請求後。

我該如何改變以獲得實際的對象?

編輯: 由於This answer

所以我找到了一個解決方案,使呼叫對象,但它並不完美選擇(甚至是錯誤的,因爲我不是很編程經驗,但它工作我)

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 。我期待着改進這個代碼,如果你會給我一些建議。

+0

您必須等待響應(您不等待'.executeAsyc()'),然後如果想在創建構造函數*後立即獲取對象*,請使用getObject()。 可以通過'FacebookRequest'constructor中的'.executeAndWait()'替換'.executeAsync()'來完成 –

回答

4

你在找什麼在這裏解釋(Facebook API how to wait til graphRequest executeAsync is done)。 正如你問,創建構造函數.executeAsyc()替換.executeAndWait()後使用它

由於主線程凍結和用戶體驗不佳,因此不提供此建議。

+0

最後,感謝您爲我提供此鏈接。 – Markus

+0

是@Matteo你是對的我也有同樣的問題,我解決這個解決方案。 –

1

你爲什麼不跟着https://developers.facebook.com/docs/android/graph/本文檔和使用這種方法GraphRequest.newMeRequest()

+0

我在我的問題中提到的是「爲了避免重複代碼,我決定爲GraphRequest創建一個類。 我沒有任何問題來獲取活動中的數據。 我想要實現的是從任何類獲取JSONObject,只需調用'JSONObject object = fbRequest.getGraphApi(path,token); '沒有提出新的請求功能。 – Markus

4

而不是調用的。 private static FacebookRequest fbRequest;靜態地,你應該在構造函數中調用,這樣你的對象不會爲空,並且作爲存儲在對象中的響應的返回,你將接收到的數據而不是null。