Xamarin.Forms实现的Page切换的Loading效果

不知道大家感觉的到不,Xamarin.Forms生成的APP,在进行Page切换的时候,如果对应的页面的组件较多,总是感觉欠缺了点什么,明显的有点卡顿,尤其是在手机的配置较低的情况下。

笔者曾经考虑过,在构造函数的

InitializeComponent();

之前使用

Acr.UserDialogs.UserDialogs.Instance.ShowLoading("加载中");

之后再调用

Acr.UserDialogs.UserDialogs.Instance.HideLoading();

隐藏Loading。

但是悲剧的发现,UI根本没有出现Loading,还是跟原来一样,但是如果注释掉了InitializeComponent()这一行,改成休眠1秒钟,Loading就会正常的出现。但是只要InitializeComponent()方法被调用,都不会刷新UI。

期间做了很多的方法,都没有效果。

后来经过仔细的看了一下Xamarin的文档,终于找出问题的根源在哪里了。其实对于一个Page的生命周期,当进入一个Page之前,首先会调用构造函数,在构造函数中,会执行InitializeComponent()来绑定Xaml文件中的组件(这个绑定机制我没有深入研究)。在构造函数里面,Xamarin并不会时刻的刷新UI,避免压力过大。所以无论我们这个构造函数里面怎么去倒腾,都会需要等待。

当构造函数执行完成之后,就会加载OnAppearing()方法。在这两个方法之间,UI是会刷新的。所以说,我们把cs代码也没的结构做一下调整,问题就可以得到解决。

1、构造函数不再调用InitializeComponent()方法,里面只加上一句

Acr.UserDialogs.UserDialogs.Instance.ShowLoading("加载中");

2、在OnAppearing()方法修改为如下:

protected override void OnAppearing()

{

    base.OnAppearing();

    if (Content == null)

    {

        Device.StartTimer(TimeSpan.FromSeconds(0), () =>

        {

            InitializeComponent();

            Refresh();

            Acr.UserDialogs.UserDialogs.Instance.HideLoading();

            return false;

        });

        return;

    }

    Refresh();

}

以上代码之所以加上Content == null的判断,主要是因为此方法再每次最小化、返回的时候都会被执行,加上可以避免重复执行InitializeComponent()方法。

经过以上调整,基本上点击按钮之后,就马上可以处理Loading的提示,加载完成之后,Loading会自动的隐藏。

但是这个也会造成一个问题,就是有时候我们需要在OnAppearing事件中做一些数据刷新的操作,就会产生Null报错的问题,具体的原因是由于我们异步的进行Xaml的初始化,再显示的时候,有可能该变量还没有初始化呢。所以应该将这些刷新的操作集成到一个方法Refresh()里面,并且刚方法应该在主线程中执行。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 适用于 iOS 和 Android 的 Xamarin SDK 提供了一个非常高性能的基础,以便构建 Xamari...
    Xamarin信仰中心阅读 7,668评论 0 5
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,806评论 1 32
  • 莎伦 2013-1-10 23:29 1. 不要把所有事情认为理所当然。 2 .努力不要让自己成为一个言语攻击者。...
    lijutong_010阅读 2,325评论 0 0
  • 现在是5.23日深夜,窗外风很大,雨滴答滴答地叨扰浅睡的人儿。不知道那些独自外出的人有没有记得带伞,如果没有,会不...
    梓若有木阅读 1,475评论 0 0
  • 姓名:周玉霞 六项精进:327期学员 公司:温州易道伟业企业管理咨询有限公司 地点:温州市鹿城区东龙路46号 【日...
    Anne玉阅读 812评论 0 0