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