首先尝试在Xamarin中使用HTTPClient。表单不起作用

时间:2019-02-28 20:07:20

标签: xamarin.forms httpclient

我知道这应该很简单,所以我显然缺少了一些东西。

我正在编写一个非常简单的Xamarin.Forms应用程序,并将其作为Shared项目的MainPage.xaml.cs

public partial class MainPage : ContentPage
{
    public MyClass myClassInstance { get; set; }

    public MainPage()
    {
        InitializeComponent();

        DownloadDataAsync();            
    }

    private async void DownloadDataAsync()
    {
        string page = @"http://www.blaw.com:80/foo/bar"; 

        try
        {
            HttpClient client = new HttpClient();
            var uri = new Uri(string.Format(page, string.Empty));

            var response = await client.GetAsync(uri);  <---  BONK!
            if (response.IsSuccessStatusCode)
            {
                var responseString = await response.Content.ReadAsStringAsync();
                XmlSerializer ser = new XmlSerializer(typeof(MyClass));
                using (TextReader tr = new StringReader(responseString))
                {
                    myClassInstance = (MyClass)ser.Deserialize(tr);
                }
            }
            else
                System.Diagnostics.Debug.WriteLine(response.StatusCode.ToString());
        }
        catch (Exception ex)
        {
            System.Diagnostics.Debug.WriteLine(ex.Message);

        }
    }
}

当我在Android设备上运行它时,它永远不会超过GetAsync行(标记为<-BONK!)。它不会引发异常,并且永远不会在if语句中产生异常,它只是从方法中返回而根本不做任何事情。

我已在Android清单中启用了ACCESS_NETWORK_STATE和INTERNET权限。

我想念什么?

1 个答案:

答案 0 :(得分:2)

从构造函数中调用异步方法不是一个好主意。这将在控制台应用程序中起作用,而在UI应用程序中则无效。因为这将阻塞UI线程,并且控制永远不会由于死锁而返回到代码。

如果您可以在OnAppearing中调用异步方法,则它应该可以正常工作。