我昨天开始在Android上使用Xamarin,非常好。 当然,我喜欢每个人都必须犯一些错误。
我尝试的只是使用以下代码行异步下载www.google.com的HTML:
private async void btnAuthenticate_Click(object sender, System.EventArgs e)
{
Toast.MakeText(this, "method is being called", ToastLength.Long).Show();
string test = await Task.Run(() => new WebClient().DownloadString("http://google.de/"));
Toast.MakeText(this, test, ToastLength.Long).Show();
}
单击按钮时,将显示Toast“方法正在调用”,而且几乎没有其他内容。首先需要至少1 1/2分钟才能显示出一些反应,无论是应用程序崩溃,什么都不做,或者打印出我想要的东西。让我们说10次尝试打印出预期的2倍。
我使用WPF C#桌面应用程序尝试了相同的代码,它工作正常。
应用程序甚至没有冻结或其他东西。 调试器输出大致相同:
“工人开始” 或者有时它说“爬山,改变最大线数x” 要么 “线程开始:#X” 我不知道这是否相关。
此外,我正在使用Visual Studio 2015和Xamarin for Android(现在为30天试用版)。
编辑:我修改应用程序,一旦应用程序以相同的行为启动,就开始下载网页。然后我从中创建了一个logcat日志,您可以看到here。
Edit²:这次我还使用Xamarin Studio创建了一个新项目。我修改了以下内容:
以下是这个应用程序的来源,有人可以自己尝试这个并告诉我是否还需要超过30秒来制作这个webrequest应该在1-2秒内实际完成。 Here is the demo project
我希望你们可以帮助我。 提前谢谢。
答案 0 :(得分:3)
代码的异步性质没有任何问题; Toast
仅用于显示短消息。
对我来说,对http://google.de/
的网络请求包含大约48,000个字符。给Toast
这么多内容会导致它在构建视图时锁定UI线程以呈现到屏幕上。
您可以通过在Web请求周围打包进度对话框来验证代码是否确实是异步的:
var pd = ProgressDialog.Show(this, "Downloading...", "Fetching content from \"http://google.de/\"");
string content = await Task.Run(() => new WebClient().DownloadString("http://google.de/"));
pd.Dismiss();
您会注意到ProgressDialog
会出现并旋转(这意味着网络请求位于后台线程中,因为用户界面没有被锁定)并且它会在网络上被忽略请求任务完成。