2016-04-16 8 views
0

こんにちは皆私はXamarin.Formsを使ってアプリケーションを作成しています。私はFacebookのログインを作成し、ユーザーIDを取得することができました。私は今、ユーザーのフレンドリストを取得しようとしています。Xamarin.forms/Android Facebook get Friends

private void getFriends() { 
     FacebookClient fb = new FacebookClient (App.Token); 

     fb.GetTaskAsync ("me/friends").ContinueWith (t => { 
      try { 
       var result = (IDictionary<string, object>)t.Result; 
       var data = (IList<object>)result ["data"]; 

       foreach (IDictionary<string, object> friend in data) { 
        App.addFriendToList ((string)friend ["name"], (string)friend["id"]); 
       } 
      } catch { 
       App.addFriendToList ("No Friends Using imin", "0000"); 
      } 
     }); 
    } 

コードはアンドロイドのためである。しかし私は、ここに私のコードです、私は私のアプリで同定された1つを参照してくださいカント(私はテストユーザーとしての友人を持っている)、アプリを受け入れているユーザーのみが表示できることを理解しました。このコードは、Xamarin Facebook SDKからインスピレーションを受けています(コピー貼り付けはしていません)。そうすればうまくいくはずです。しかし、友人を表示するはずのリストは空のままです(私はエラーをキャッチしないことに注意してください)。

ありがとうございます!

+0

は、データを取得しているのにUIが表示していないという問題ですか?または、最初にデータを取得していないとしますか?それらは2つの異なる問題であり、解決する必要のあるものを特定する必要があります。 – Jason

+0

私は掘り下げていて、多分私のUIは更新されません、私はちょうど下のフィリップスの答えを試してみます。 –

答えて

0

ContinueWithのコールバックは実際には異なる同期コンテキストで実行されます。おそらくUIは更新されません。これをやってみてください。

private void getFriends() { 
    FacebookClient fb = new FacebookClient (App.Token); 

    // There call for "Result" here will wait for the task to complete before returning. 
    var result = (IDictionary<string, object>)fb.GetTaskAsync ("me/friends").Result; 
    var data = (IList<object>)result ["data"]; 

    foreach (IDictionary<string, object> friend in data) { 
     App.addFriendToList ((string)friend ["name"], (string)friend["id"]); 
    } 
} 

が、これはUIスレッドをブロックするわけではないしてくださいということと、アプリケーションがGet呼び出し中に応答しないままになります。このような何かが望ましいだろう。

private async Task getFriends() { 
    FacebookClient fb = new FacebookClient (App.Token); 

    //Here the call to ConfigureAsync(true) will force the synchronization context back to the one before the call (the UI thread in this case) 
    var result = (IDictionary<string, object>)(await fb.GetTaskAsync ("me/friends").ConfigureAsync(true)); 
    var data = (IList<object>)result ["data"]; 

    foreach (IDictionary<string, object> friend in data) { 
     App.addFriendToList ((string)friend ["name"], (string)friend["id"]); 
    } 
} 
+0

答えをありがとう、私は効果的に私のUIが更新されていないと思う:私は名前とIDで構築されたオブジェクトの友人のリストを表示するListviewを使用します。リストビューには、いつでも表示されているリストの内容がすべて表示されますか?更新するには、リストビューを更新するために(ListView.ItemsSource = yourlist)更新する必要がありますか?もしそうなら、私は回避策を見つけなければならない –

+0

私はAndroidのUIに慣れていませんが、参照が変更されないとソースを再割り当てしなければならない理由はわかりません...おそらく、再描画などを強制する! –

+0

List <> noの場合は、例外をスローするソースを変更できません。ソースを変更できるようにObservableCollections <>を使用しなければなりませんでした。 –

0

さてさて、私は愚かなミスを犯し、私は友人を格納するために使用されるリストを初期化しませんでした二回チェックしているはずです。私の初期のコードはうまくいきます。

関連する問題