Xamarin Android DownloadString需要很长时间甚至不工作

时间:2016-01-04 01:46:05

标签: c# android asynchronous xamarin mono

我昨天开始在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创建了一个新项目。我修改了以下内容:

  1. 为清单添加了Internet权限。
  2. 将默认按钮代码更改为我的需要。
  3. 以下是这个应用程序的来源,有人可以自己尝试这个并告诉我是否还需要超过30秒来制作这个webrequest应该在1-2秒内实际完成。 Here is the demo project

    我希望你们可以帮助我。 提前谢谢。

1 个答案:

答案 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会出现并旋转(这意味着网络请求位于后台线程中,因为用户界面没有被锁定)并且它会在网络上被忽略请求任务完成。