Facebook API如何等待graphRequest executeAsync完成

时间:2016-03-10 00:40:44

标签: java android facebook facebook-graph-api

我正在使用脸谱图请求来检索好友列表。但是,如何在调用graphRequest.executeAsync()之后创建一个函数并将其返回?

private Map<String, String> getFacebookFriends(AccessToken accessToken, Profile profile) throws InterruptedException, ExecutionException {
    final Map<String, String> friendsMap = new HashMap<>();
    GraphRequest graphRequest = new GraphRequest(accessToken, "/me/friends", null, HttpMethod.GET,
            new GraphRequest.Callback() {
                public void onCompleted(GraphResponse response) {
                    JSONObject jGraphObj = response.getJSONObject();
                    try {
                        JSONArray friendsData = jGraphObj.getJSONArray("data");
                        for (int i = 0; i < friendsData.length(); i++) {
                            JSONObject friend = friendsData.getJSONObject(i);
                            String friendId = friend.getString("id");
                            String friendName = friend.getString("name");
                            friendsMap.put(friendId, friendName);
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
    );
    List<GraphResponse> gResponseList = graphRequest.executeAsync().get();
    return friendsMap;
}

我目前正在使用与this post相同的技术。通过调用它来graphRequest.executeAsync().get();。但似乎它没有用。

上述功能将在friendsMap完成之前返回graphRequest

任何建议都表示赞赏。

2 个答案:

答案 0 :(得分:3)

我使用innerMethod()代替executeAndWait功能使其工作正常。所以,这就是决赛的样子

executeAsync

答案 1 :(得分:0)

对于需要C#版本的任何人。这就是我在主要活动中所拥有的。

    public static ICallbackManager CallbackManager = CallbackManagerFactory.Create();
    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);

        var facebookCallback = new FacebookCallback<LoginResult>
        {
            HandleSuccess = async shareResult =>
            {
                Bundle parameters = new Bundle();
                parameters.PutString("fields", "id,name,link,email,picture.type(normal),friends");

                GraphRequest request = new GraphRequest(
                    shareResult.AccessToken,
                    "/me",
                    parameters, HttpMethod.Get, new OnGraphResulCallback());

                await Task.Run(() =>
                {
                    var fbResponse = JsonConvert.DeserializeObject<FbResponse>(request.ExecuteAndWait().RawResponse);
                });
            },
            HandleCancel = () =>
            {
                Console.WriteLine("HelloFacebook: Canceled");
            },
            HandleError = shareError =>
            {
                Console.WriteLine("HelloFacebook: Error: {0}", shareError);
            }
        };

        // fb init 
        FacebookSdk.SdkInitialize(this.ApplicationContext);
        LoginManager.Instance.RegisterCallback(MainActivity.CallbackManager, facebookCallback);

        Forms.Init(this, bundle);
        LoadApplication(App.Instance);
    }

以下是帮助程序类:

public class FacebookCallback<TResult> : Java.Lang.Object, IFacebookCallback where TResult : Java.Lang.Object
{
    public Action HandleCancel { get; set; }
    public Action<FacebookException> HandleError { get; set; }
    public Action<TResult> HandleSuccess { get; set; }

    public void OnCancel()
    {
        HandleCancel.Invoke();
    }

    public void OnError(FacebookException error)
    {
        HandleError.Invoke(error);            
    }

    public void OnSuccess(Java.Lang.Object result)
    {
        HandleSuccess.Invoke(result.JavaCast<TResult>());
    }
}

public class FbResponse
{
    public long Id { get; set; }
    public string Name { get; set; }
    public Picture Picture { get; set; }
    public Friends Friends { get; set; }
    public string Email { get; set; }
}
public class Friends
{
    public List<FriendsData> Data { get; set; }
    public Paging Paging { get; set; }
    public Summary Summary { get; set; }
}
public class Summary
{
    public int Total_Count { get; set; }
}
public class Paging
{
    public Cursors Cursors { get; set; }
}
public class Cursors
{
    public string Before { get; set; }
    public string After { get; set; }
}
public class FriendsData
{
    public int Id { get; set; }
    public string Name { get; set; }
}
public class Picture
{
    public PictureData Data { get; set; }
}
public class PictureData
{
    public bool Is_Silhouette { get; set; }
    public string Url { get; set; }
}