2016-05-30 13 views
1

私は既にアプリケーションがインストールされているすべての友達を取得する方法を実装しています。GraphRequestは決して完了しませんでした

私は&のチュートリアルの後に続きますが、私は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アンドロイドで何かのこの王を実装し、コードサンプルを使用している場合、これは非常に有用となります。

ありがとうございました。

答えて

1

OnCompletedハンドラについてのオブジェクトの「要求」をどこに伝えていないのですか。

OnCompletedイベントが発生したときに、何を呼び出すかを明示的に要求オブジェクトに伝える必要があります。

このコードは、あなたが要求を作成した後に右である必要があり、この小さなスニペットのように多くのことを見ていきます:

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

しかしGraphRequestためのAPIに合わせて変更...

UPDATE:

私はあなたのコメントを見た直後、私はGraphRequestをGoogleで検索し、これを見つけた: enter image description here

私が上記で述べたように、オブジェクトに何を呼び出すべきかを教えなければならず、それを行う方法はAPI固有のものになります。だから私はそれを見つめた。あなたのケースでは

コールバックを指定する方法はGraphRequest.NewMyFriendsRequestへの呼び出しの第二引数(ようにする方法「公共ボイドonCompleted()」を実装するオブジェクト)を渡すことです。

あなたはの綴りを除き、コールバックインターフェイスを実装したクラスのインスタンスに渡しているがのfuction名をonCompleted(あなたは「をOnCompleted」を使用 - OにOを変更)との使用OnCompleted()関数の署名にasyncキーワードが含まれています。

これは、OnCompleted()関数がでなく、がインターフェイス定義と完全に一致するようにします。

インタフェース定義は、FacebookのAPIドキュメントは、非同期機能を使用することをお勧めしませんHere

ですので、あなたが定義でこれを持っている理由私は知りません。

だから、にコールバック関数の定義を変更します。私は、以前より明確にされていないことをお詫び申し上げます

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

+0

あなたの答えをありがとう、私は前にこの情報を見つけられませんでした。私は明日テストします – OrcusZ

+0

CompletedHandlersはリクエストオブジェクトで利用できません – OrcusZ

+0

あなたの説明をお寄せいただきありがとうございます、私はあなたのステップ(再実装)に従って、今はすべて動作しています。 – OrcusZ

関連する問題