我知道这应该很简单,所以我显然缺少了一些东西。
我正在编写一个非常简单的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权限。
我想念什么?
答案 0 :(得分:2)
从构造函数中调用异步方法不是一个好主意。这将在控制台应用程序中起作用,而在UI应用程序中则无效。因为这将阻塞UI线程,并且控制永远不会由于死锁而返回到代码。
如果您可以在OnAppearing中调用异步方法,则它应该可以正常工作。