【C#】用VS2015中Xamarin开发跨平台APP的感受(二)

       上篇文章主要讲了用VS2015中Xamarin开发跨平台APP上手体验,包括环境搭建和安装体验,以及一些开发上的初体验,时至今日,用Xamarin进行跨平台开发又有一段时间了,今天就具体开发过程中要面对的东西,来说说开发感受吧。
 

     (1)导航的不好处理:上篇也有提及,将原生的activity换成wpf中的from,这样需要自己定义导航,原生的activity管理的页面是交给安卓系统管理的,系统里面有页面栈,这里几经转换好像没了,自己管理,当然,还是有开源的导航插件供你使用,算是没把路堵死。那用起来咋样呢,感觉不咋地(当然也有自己没清楚弄懂其代码实现机制有关,但讲真,这个需要我们做应用的去深入了解吗?反正我知道安卓不需要)。主要的问题不是导航,而是导航后,你的上一个页面以及再之前页面的管理,毕竟我们按返回键还得回来呢。导航插件肯定考虑到了这一点,可以重写返回方法,但又会牵涉到下几点。

     (2)Xamarin采用跟WPF一样的MVVM开发模式:即Xamarin.froms采用数据驱动,原生是采用的事件驱动,当然也有基于MVVM模式的框架,但少有人用。这里没有那种模式更好,只是对你来说可能又是一个学习和适应的过程。当然,有经验的WPF开发工程师不在此列。

 

     (3)Xamarin页面周期跟原生不同:由于MVVM模式,Xamarin.froms的显示周期是构造函数->显示函数->初始化数据函数,初始化数据函数是通过导航过来直接调用的。发现问题没有?你导航到新页面,会先进构造,然后调用当前类的显示方法决定是否加载非数据资源,如功能按键(数据的显示是通过MVVM实现,在这个函数里可以不用管),再调用初始化数据函数更新要显示的数据。结果就是:有可能你要显示的非数据资源出现问题。因为正确的方式应该是,通过导航传递过来的数据,决定是否显示非数据资源,这里有点绕,关键是受MVVM模式影响到了。例如,你的公用模板(或自定义控件)在多个页面都会调用,要根据上一个页面传来的数据,决定模板某些部分是否显示的情况。所以正确的顺序应该是构造函数->初始化数据函数->显示函数。明显初始化数据函数应该在显示之前,怎么办,那么你只有不重写显示函数,设置该类的全局变量来决定是否显示非数据资源,在初始化数据函数中收到数据后,改变此变量再更新界面。或者用事件监听传过来的数据,做判断后再更新一次界面。我靠!!!也因如此,有了下面的问题。

 

     (4)页面缓存:为啥需要页面缓存?一是想提高效率,不用每次构造并重绘页面,二是节省流量,不用每次切换页面都请求服务器上的数据。但是坑来了,结合上面的导航,这个代码实现起来很麻烦,Xamarin.froms没有此功能,你得自己写。实现此点后,在第3点上又不会进构造函数了,而且你要缓存页面所有的相关资源!!!小APP不考虑,但是遇到大的APP呢,所以这里有引入了下一个问题。

     (5)内存:基于上面一点,APP占用内存占用会增加很多,内存占用一高,加上上面提到的刷新界面次数增多,效率便难以提高,与第4点提到的提高效率,又有点背道而驰了。即便你用缓存,在系统内存紧张时(比如开30个后台程序),系统会回收资源,这个时候你自定义的缓存机制,缓存的页面被回收了,你是无法恢复的,且你误认为还在缓存栈里面。这种情况你自定义也不行了,涉及系统方面,但原生安卓可以,你调用onSavaInstance就行。

     (6)流量:基于第4点中,引入缓存省流量的做法,确实是省了一部分,但比起原生安卓,原生能在这种情况下,再省将近50%,因为首先我们可以把数据一次获取,全局缓存。而且这里只缓存数据,而前面可是缓存了跟你数据(或页面)相关的所有资源啊!另外推送数据来了更新本地缓存数据就好,而缓存全部页面这时会根据推送消息,标记相关页面,在加载界面时重新从服务器获取属于该页面的数据,这个重新获取跟原生比起来,还是多花费了流量的。


       以上6点互相牵扯,接着往下看,说说体验方面很重要的。

 

 

     (7)界面UI:Xamarin.froms在UI这块可是跟其鼻祖WPF完全相反的,微软的WPF也是使用Xaml绘制UI界面,那支持的特性真实一个多啊,渲染出来真叫一个漂亮啊。到了这里很多属性不支持,还砍掉了很多原生Android和iOS的界面属性,导致做出来的界面真心一般。我们美工设计了很多界面和交互模式,拿给我们问能不能做出来,我们几个工程师都说做不了。这个效果不是好多APP都有的吗?但我们尽力了,真心做不了,包括老程序员大牛,能做的话花的时间也会空前巨大,而原生Android和iOS很多都不需要你写,编译器都能帮你完成,你只需要改改就行。

 

 

     (8)页面层次太多:Xamarin.froms就我使用起来感觉就采用了原生的线性布局,其它布局都舍弃了,导致很多快速的页面切换无法完成,比如滑动抽屉式跳转页面。这一层层的页面跳转,就好像一个二叉树,容易让新手置若迷宫。真实例子,我们开发的APP层级达到了7级,什么概念!(当然也跟自身页面跳转没设计好有关,但不好设计是真的)如果你当前浏览到第6级的某页面,你现在要看属于第7级的某页面,你有可能会像二叉树遍历一样,一步步回到第1级,然后再尝试到达该页面。层级越多,你在里面的页面跳转,就越像在走迷宫。

       总结:有可能你会说我整篇都是吐槽之声了,好吧,我承认,举个简单例子,你用惯了苹果手机,教你用塞班手机你习惯不?就是这个感受,Xamarin.froms不是能不能做到的问题,而是好不好做,做出来好不好用的问题!你用塞班手机也能玩切水果,但那跟用安卓手机切水果不能比,跟苹果手机的切水果就更不能比了!今天就先说到这里,后面我再更新几个关于Xamarin.froms中的bug,是你会在开发中碰到的,如果你有什么看法的话,欢迎留言。

你可能感兴趣的:(C#,Android)