【问题标题】:Xamarin Android DownloadString takes ages or not even worksXamarin Android DownloadString 需要很长时间甚至无法正常工作
【发布时间】:2016-01-04 01:46:04
【问题描述】:

我昨天开始使用适用于 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. 根据我的需要更改了默认按钮代码。

这是这个应用程序的来源,有人可以自己尝试一下,并告诉我是否也需要超过 30 秒的时间才能完成这个 webrequest,而实际上应该在 1-2 秒内完成。 Here is the demo project.

我希望你们能帮助我。 提前致谢。

【问题讨论】:

    标签: c# android asynchronous xamarin mono


    【解决方案1】:

    您的代码的异步性质没有任何问题; Toast 仅用于显示简短消息。

    对我来说,对http://google.de/ 的网络请求包含大约 48k 个字符。给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 将出现并旋转(这意味着 Web 请求在后台线程中,因为 UI 未锁定)并且当 Web 请求任务完成时它会关闭。

    【讨论】:

    • 好吧,我可能应该说,我已经正确调试了我的应用程序,而且它肯定是需要很长时间才能完成的异步代码。现在我用你的代码再次测试了它。 ProgressDialog 正在加载至少 1 分钟。紧接着,Visual Studio 打开了一个小窗口,提示发生了未处理的异常,没有更多信息。
    • 在这种情况下,请在您的问题中包含 logcat 输出,因为这将提供有关错误原因的线索。
    • 确保您的清单中也包含了android.permission.INTERNET
    • 是的,确实如此,有时它会像我说的那样工作,但仅在 1 分钟后。但大多数情况下它只是抛出未处理的异常。
    • 我尝试了这个示例:developer.xamarin.com/recipes/android/web_services/… 我将完全相同的代码放入我的应用程序中,并且一切正常。但是,一旦我将 URL 更改为另一个 URL,它需要 1 分钟,并且在这一分钟之后它会显示正确的结果。
    猜你喜欢
    • 1970-01-01
    • 2022-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-14
    • 2016-10-21
    • 2014-07-29
    • 1970-01-01
    相关资源
    最近更新 更多