GraphRequest永远不会在完成时加注

时间:2016-05-30 19:31:30

标签: c# facebook-graph-api xamarin xamarin.android

我实现了一个方法来获取已安装该应用程序的所有朋友。

我关注一些帖子&教程,但我无法进入OnCompleted方法。

这是我的代码:

public class FacebookHelper : Java.Lang.Object, GraphRequest.IGraphJSONArrayCallback
    {
        //Facebook structure
        struct FbUser
        {
            public string Id;
            public string Name;
        }

        private List<Friend> allfriends;

        public List<Friend> Friends { get; set; }
 /// <summary>
        /// Link a new users with his friends
        /// </summary>
        /// <param name="allfriends">list of friends</param>
        /// <returns>task to be awaitable method</returns>
        public void AddFacebookFriends(List<Friend> allfriends)
        {

            this.allfriends = allfriends;
            //create client connexion
            GraphRequest request = GraphRequest.NewMyFriendsRequest(AccessToken.CurrentAccessToken, this);
            Bundle parameters = new Bundle();
            parameters.PutString("fields","id,name");
            request.Parameters = parameters;

            request.ExecuteAsync();

        }

        public async void OnCompleted(JSONArray p0, GraphResponse p1)
        {
            Console.WriteLine(p1.ToString());
            //get result from facebook
            dynamic friends = JsonConverter.GenericJsonConverter(p0);

            List<FbUser> fbUsers = new List<FbUser>();


            //push all facebook friend in a list
            foreach (var friend in friends["data"].Children())
            {
                FbUser fbUser = new FbUser();
                fbUser.Id = friend["id"].ToString().Replace("\"", "");
                fbUser.Name = friend["name"].ToString().Replace("\"", "");
                fbUsers.Add(fbUser);
            }


            if (allfriends.Count > 0)
            {

                //get all friends object matching the facebook ids
                var list = from first in allfriends
                           join second in fbUsers
                           on first.User.Facebook_Id
                           equals second.Id
                           select first;

                //get the friendID of the current user
                var myFriendId = allfriends.FirstOrDefault(f => f.User.Id == User.Instance.Id).Id;

                List<UserFriends> userFriends = new List<UserFriends>();

                foreach (var item in list)
                {
                    //Link the current user with this friend
                    UserFriends userFriend = new UserFriends();
                    userFriend.FriendID = item.Id;
                    userFriend.UserID = User.Instance.Id;

                    userFriends.Add(userFriend);

                    //Link this friend to the current user
                    userFriend = new UserFriends();
                    userFriend.FriendID = myFriendId;
                    userFriend.UserID = item.User.Id;

                    userFriends.Add(userFriend);

                }

                var playingfriends = await ManageFriends.CreateFriend(userFriends);

                Friends = Friend.Instance.CreateListFriend(playingfriends);

                await ManageFriends.CreateFriend(userFriends);
            }
        }
    }

如果有人已经在xamarin android中实现了这个东西之王,并且有一个代码示例,这将非常有用。

感谢。

1 个答案:

答案 0 :(得分:1)

我没有看到你告诉对象的位置&#39;请求&#39;关于OnCompleted处理程序。

当OnCompleted事件发生时,您必须明确告诉请求对象要调用的内容。

在创建请求后,该代码应该是正确的,并且看起来很像这个小片段:

request.CompletedHandlers += new System.EventHandler(this.OnCompleted);

但已修改为适合GraphRequest的API ...

<强> 更新:

在我看到你的评论后,我用Google搜索了GraphRequest并发现了这个: enter image description here

正如我在上面提到的,你必须告诉对象要调用什么,以及如何做到这一点将特定于API。所以我查了一下。

在您的情况下,指定回调的方法是将实现方法&#39; public void onCompleted()&#39; 的对象作为调用的第二个参数传递to GraphRequest.NewMyFriendsRequest()。

您正在传递类实例,它实现了回调界面,但 onCompleted 功能名称的拼写除外(您使用&#39; OnCompleted &#39; - 将O更改为o)并在OnCompleted()函数的签名中使用 async 关键字。

这会使OnCompleted()函数与接口定义完全匹配。

界面定义为Here

Facebook API文档不建议使用异步功能,所以我不知道你在定义中有这个原因。

因此,将回调函数的定义更改为:

   public void onCompleted(JSONArray p0, GraphResponse p1)
    {
        Console.WriteLine(p1.ToString());
        .....

我为之前不太清楚而道歉。