【问题标题】:How to make activity indicator wait for a function如何使活动指示器等待功能
【发布时间】:2021-08-06 05:24:17
【问题描述】:

我想使用活动指示器来显示我的函数正在加载。它运行得如此之快,以至于我可以看到我的活动指示器,但该功能尚未完成加载

问题:当功能真正完成运行时,如何使用使我的活动指示器变为假

这是我的代码:

  public MainPage()
        {


            InitializeComponent();
            On<iOS>().SetUseSafeArea(true);

            activityIndicator.IsRunning = true;
         
            MyPageName = "home";


            var tasks = new List<Task>();

          
            tasks.Add(Task.Run(async () => {

            GetMyLeafLanguage(); //p


            }));


            tasks.Add(Task.Run(async () => {

                    if (App.CheckConnection() == true)
                    {
                        MyAds();  // doit être apres l'initialisation         //
                        LoadtestPage();
                    }
            }));



            Task.WhenAll(tasks);
            #endregion My Initial Tasks

             OnGoTutorial();


            MyNotificationActivate();

            activityIndicator.IsRunning = false;


        }

【问题讨论】:

  • 首先,不要在构造函数中做所有这些
  • 我需要创建一个包含所有这些的函数吗?
  • 页面构造器运行之前页面甚至显示。 OnAppearing 在 UI 准备好显示后触发
  • 如果我想显示我的函数的活动,我该怎么办?

标签: c# xamarin.forms


【解决方案1】:

按照你写的方式,任务必须完成它们的工作,页面可以显示。所以页面(终于)显示出来了,但是由于工作已经完成,活动指示器立即消失了。

这些函数应该在页面显示后运行

否则,当任务运行时,用户将看到一个空白屏幕(或在您开始创建此页面之前显示的任何页面)。


很遗憾,在页面首次显示后没有运行跨平台事件。

这是在后台工作完成时让页面显示的一种方法:

public partial class MyPage : ...
{
    protected override void OnAppearing()
    {
        base.OnAppearing();

        BeginWorkWithIndicator();
    }
    
    private void BeginWorkWithIndicator()
    {
        activityIndicator.IsRunning = true;

        // The delay gives Xamarin UI a little time, before your background work begins.
        // Without this delay, under some circumstances, the page might not show up as quickly.
        Device.StartTimer(TimeSpan.FromMilliseconds(100), () => {
            OneTimeBackgroundWork();
            // Run timer only once.
            return false;
        });
    }

    private void OneTimeBackgroundWork()
    {
        ... Long-running work - MUST NOT TOUCH UI ...
        
        // When done.
        Device.BeginInvokeOnMainThread(() => {
            // NOW MAKE UI CHANGES, based on variables set by work above.
            ...
            activityIndicator.IsRunning = false;
        });
    }
}

【讨论】:

  • 我应该把我所有的功能放在 OnAppearing 的什么地方?还是 OneTimeBackgroundWork ?
  • @hko - OneTimeBackgroundWork。这段代码的目的是在后台线程上完成这项工作,以便页面可以快速出现。在页面出现之前,用户不会看到活动指示器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-27
  • 1970-01-01
相关资源
最近更新 更多