2017-10-13 13 views
10

मैं एप्लिकेशन बना रहा हूं जिसके लिए फेसबुक से डेटा प्राप्त करने की आवश्यकता है। डुप्लिकेटिंग कोड से बचने के लिए मैंने 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 और केवल उस अनुरोध को निष्पादित करने के बाद वापस आती है।

कॉल पर वास्तविक ऑब्जेक्ट प्राप्त करने के लिए मुझे क्या बदलना चाहिए?

संपादित करें:

तो 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 का उपयोग() आप निर्माता बनाने के बाद वस्तु * सही प्राप्त करना चाहते हैं, तो * है। ''executeAsync()' 'executeAsync() ''executeAwync()' 'executeAndWait() 'के साथ' .executeAndWait() 'को' फेसबुकRequest'constructor –

उत्तर

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

में बदलकर किया जा सकता है, मैंने अपने प्रश्न में जो भी उल्लेख किया था, "डुप्लिकेटिंग कोड से बचने के लिए मैंने ग्राफरक्वेट के लिए कक्षा बनाने का निर्णय लिया।" मुझे गतिविधि में डेटा प्राप्त करने में कोई समस्या नहीं है। क्या मैं हासिल करना चाहते हैं किसी भी वर्ग से JSONObject प्राप्त करने के लिए, बस बुला 'JSONObject वस्तु = fbRequest.getGraphApi (पथ, टोकन) से है, नया अनुरोध समारोह किए बिना। – Markus

4

बुला के बजाय का उपयोग नहीं करते। private static FacebookRequest fbRequest; संवैधानिक रूप से, आपको कन्स्ट्रक्टर में कॉल करना चाहिए, इस तरह आपकी ऑब्जेक्ट शून्य नहीं होगी और ऑब्जेक्ट में संग्रहीत प्रतिक्रिया के बदले में, आपको नल के बजाय डेटा प्राप्त होगा।

संबंधित मुद्दे