【问题标题】:Activity Indicator is not visible on xaml page in xamarin.forms?活动指示器在 xamarin.forms 的 xaml 页面上不可见?
【发布时间】:2016-02-15 07:09:15
【问题描述】:

我在 xaml 页面上有一个活动指示器。最初,它的 IsVisible 属性为假。我在页面上有一个按钮。当用户单击按钮时,它会调用 Web 服务来获取数据。在调用服务之前,我将 IsVisible 属性的值更改为 true,以便活动指示器开始显示在页面上,在成功调用服务后,我再次将其值更改为 false,以便它不再在页面上显示。

但它不起作用。我知道实际的问题。当我们调用 Web 服务时,UI 线程被阻塞并且它不显示活动指示器。 如何在调用 Web 服务时启用 UI 线程,以便活动指示器可以显示在页面上,直到我们获取数据?

【问题讨论】:

    标签: xamarin.forms loader activity-indicator


    【解决方案1】:

    尝试将您的网络服务调用转换为asyncawait

    根据您的结构,您可能必须使用TaskCompletionSource,如下例所示。

    在这个例子中,当按钮被点击时,按钮不可见ActivityIndicator被设置为IsRunning=True显示它。

    然后它使用TaskCompletionSource 在函数ExecuteSomeLongTask 中执行您长时间运行的任务/网络服务。

    原因是在我们的按钮点击代码中,我们有最后几行:-

                  objActivityIndicator1.IsRunning = false;
                  objButton1.IsVisible = true;
    

    停止ActivityIndicator 停止运行和显示,将按钮设置回可见状态。

    如果我们不使用TaskCompletionSource,这些行将在调用ExecuteSomeLongTask(如果它是一个普通的异步方法/函数)后立即执行,并导致ActivityIndicator 运行并且按钮仍然可见。

    示例:-

            Grid objGrid = new Grid()
            {
            };
    
            ActivityIndicator objActivityIndicator1 = new ActivityIndicator();
            objGrid.Children.Add(objActivityIndicator1);
    
            Button objButton1 = new Button();
            objButton1.Text = "Execute webservice call.";
            objButton1.Clicked += (async (o2, e2) =>
              {
                  objButton1.IsVisible = false;
                  objActivityIndicator1.IsRunning = true;
                  //
                  bool blnResult = await ExecuteSomeLongTask();
                  //
                  objActivityIndicator1.IsRunning = false;
                  objButton1.IsVisible = true;
              });
            objGrid.Children.Add(objButton1);
    
            return objGrid;
    

    支持功能:-

        private Task<bool> ExecuteSomeLongTask()
        {
            TaskCompletionSource<bool> objTaskCompletionSource1 = new TaskCompletionSource<bool>();
            //
            Xamarin.Forms.Device.StartTimer(new TimeSpan(0, 0, 5), new Func<bool>(() =>
            {
                objTaskCompletionSource1.SetResult(true);
                //
                return false;
            }));
            //
           return objTaskCompletionSource1.Task;
        }
    

    【讨论】:

      【解决方案2】:

      您需要以异步方式完成工作。或者换句话说:使用Asnyc &amp; Await 来确保您的用户界面在通话期间运行良好。

      您可以在the Xamarin Docs找到更多信息。

      async 和 await 是新的 C# 语言功能,可以协同工作 使用 Task Parallel Library 可以轻松编写线程代码 在不阻塞主线程的情况下执行长时间运行的任务 应用。

      如果您需要进一步的帮助,请更新您的问题并发布您的代码或您迄今为止尝试过的内容。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多