2017-10-13 10 views
10

Tôi đang tạo ứng dụng yêu cầu lấy dữ liệu từ Facebook. Để tránh trùng lặp mã, tôi quyết định tạo một lớp cho GraphRequest.Gọi Facebook GraphRequest từ một lớp khác trả về 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); 
}} 

Để gọi lớp tôi sử dụng

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

Vấn đề là phương pháp GraphApiRequest luôn trả object=null và chỉ sau đó thực hiện theo yêu cầu.

Tôi nên thay đổi điều gì để nhận được đối tượng thực trên cuộc gọi?

EDIT: Nhờ This answer

Vì vậy, tôi tìm thấy một giải pháp để có được đối tượng theo yêu cầu, nhưng nó không phải là lựa chọn hoàn hảo (thậm chí có thể sai, vì tôi không rất có kinh nghiệm trong lập trình, nhưng nó hoạt động cho tôi)

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

Khi tôi kêu gọi yêu cầu Nó được của thực hiện sau một thời gian

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

Để nhận được đối tượng thực sự trên cuộc gọi tôi sử dụng.

JSONObject object = fbRequest.getObject(); 

Nó vẫn không làm việc nếu tôi gọi cho một JSONObject ngay sau khi tạo constructor. Tôi mong muốn cải thiện mã này, Nếu bạn sẽ cho tôi một số lời khuyên.

+0

Bạn phải chờ phản hồi (bạn không chờ đợi vì '.executeAsyc()') và sau đó sử dụng getObject() nếu bạn muốn lấy đối tượng * ngay sau khi tạo hàm tạo *. Nó có thể được thực hiện bằng cách thay thế '.executeAsync()' bằng '.executeAndWait()' trong 'FacebookRequest'constructor –

Trả lời

4

Điều bạn đang tìm kiếm được giải thích tại đây (Facebook API how to wait til graphRequest executeAsync is done). Khi bạn yêu cầu, để sử dụng nó ngay sau khi tạo hàm tạo thay thế .executeAsyc() bằng .executeAndWait().

Điều này không được khuyến khích do đóng băng trên chuỗi chính và trải nghiệm người dùng kém.

+0

Cuối cùng, cảm ơn bạn đã cung cấp cho tôi liên kết này. – Markus

+0

Có @ Matteo bạn đúng Tôi cũng có cùng một vấn đề và tôi đã giải quyết với giải pháp này. –

1

tại sao bạn không làm theo https://developers.facebook.com/docs/android/graph/ tài liệu này và sử dụng phương pháp này GraphRequest.newMeRequest()

+0

Điều tôi đã đề cập trong câu hỏi là" Để tránh trùng lặp mã, tôi quyết định tạo một lớp cho GraphRequest. " Tôi không gặp vấn đề gì để lấy dữ liệu trong hoạt động. Điều tôi muốn đạt được là lấy JSONObject từ bất kỳ lớp nào, chỉ bằng cách gọi 'đối tượng JSONObject = fbRequest.getGraphApi (đường dẫn, mã thông báo); 'mà không thực hiện chức năng yêu cầu mới. – Markus

4

Thay vì gọi. private static FacebookRequest fbRequest; Tĩnh, bạn nên gọi hàm khởi tạo, theo cách đó đối tượng của bạn sẽ không rỗng và trả về phản hồi được lưu trữ trong đối tượng, bạn sẽ nhận được dữ liệu thay vì null.