C# Xamarin.forms/Android Facebook交友

C# Xamarin.forms/Android Facebook交友,c#,facebook-graph-api,xamarin.android,xamarin.forms,C#,Facebook Graph Api,Xamarin.android,Xamarin.forms,大家好,我正在使用Xamarin.Forms创建应用程序。我已经能够创建facebook登录并检索用户ID。我现在正在尝试获取该用户的好友列表。我知道只有接受该应用程序的用户才能显示,但我看不到在我的应用程序中识别的用户(我有一个朋友作为测试用户)。以下是我的代码: private void getFriends() { FacebookClient fb = new FacebookClient (App.Token); fb.GetTaskAsync

大家好,我正在使用Xamarin.Forms创建应用程序。我已经能够创建facebook登录并检索用户ID。我现在正在尝试获取该用户的好友列表。我知道只有接受该应用程序的用户才能显示,但我看不到在我的应用程序中识别的用户(我有一个朋友作为测试用户)。以下是我的代码:

    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");
            }
        });
    }
private void getFriends(){
FacebookClient fb=新的FacebookClient(App.Token);
fb.GetTaskAsync(“我/朋友”).ContinueWith(t=>{
试一试{
var result=(IDictionary)t.result;
var数据=(IList)结果[“数据”];
foreach(数据中的IDictionary friend){
App.addFriendToList((字符串)friend[“name”],(字符串)friend[“id”]);
}
}抓住{
App.addFriendToList(“没有朋友使用imin”,“0000”);
}
});
}
代码是针对android的。代码的灵感来源于Xamarin Facebook SDK(更不用说复制粘贴)。所以它应该会起作用。它正在工作,但是应该显示friend的列表仍然为空(请注意,我没有发现任何错误)


谢谢你的回答

ContinueWith中的回调实际上在不同的同步上下文中运行。用户界面可能不会得到更新。尝试这样做:

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"]);
    }
}
private void getFriends(){
FacebookClient fb=新的FacebookClient(App.Token);
//这里的“Result”调用将等待任务完成后返回。
var result=(IDictionary)fb.GetTaskAsync(“我/朋友”).result;
var数据=(IList)结果[“数据”];
foreach(数据中的IDictionary friend){
App.addFriendToList((字符串)friend[“name”],(字符串)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"]);
    }
}
私有异步任务getFriends(){ FacebookClient fb=新的FacebookClient(App.Token); //在这里,对ConfigureAsync(true)的调用将强制同步上下文返回到调用之前的上下文(本例中为UI线程) var result=(IDictionary)(wait fb.GetTaskAsync(“我/朋友”).ConfigureAsync(true)); var数据=(IList)结果[“数据”]; foreach(数据中的IDictionary friend){ App.addFriendToList((字符串)friend[“name”],(字符串)friend[“id”]); } }
好吧,我只是犯了一个愚蠢的错误,没有初始化我用来存储朋友的列表,应该检查两次。我的初始代码可以很好地处理这个问题。

问题是您正在获取数据,但UI没有显示数据?或者你一开始就没有得到数据?这是两个不同的问题,你需要找出你需要解决的问题。我一直在挖掘,也许我的UI没有更新,我会尝试下面的phillipe答案。谢谢你的答案,我认为我的UI实际上没有更新:我使用Listview显示使用名称和id构建的对象friend列表。Listview是否随时显示列表的全部内容,或者您是否需要更新和重做(Listview.ItemsSource=yourlist)以更新显示?如果是这样的话,我必须找到一个解决方法我不太熟悉Android UI,但我不明白如果引用没有改变,为什么你必须重新分配源代码。。。可能有办法强迫重画或诸如此类的东西!如果它来自一个列表,不,你不能修改源代码,因为它抛出了一个异常,我必须使用一个ObservableCollections来修改源代码。