在6月28日,由天翼空间·开发者工厂主办,InfoQ协助策划的第十期专家讲坛活动上,来自小米科技米聊团队研发负责人李政( @-李政- )就如何开发高质量的Windows Phone应用的问题与大家进行了分享,内容涉及应用程序架构、用户界面、性能以及错误报告等。
Windows Phone 7开发实例——构建高质量的WP7应用程序(讲稿下载)
本次分享主要分为产品设计、应用程序架构、用户界面、性能以及错误报告几个部分。
在应用程序架构部分,李政提到在WP7版米聊中,使用到了MVVM(Model-View-ViewModel)模式:
- 将Mode和View分离,方便建立简洁、易维护、易扩展的应用程序。
- 可测试性强(View和Model分离可以针对Model进行单元测试)、UI的易用性强。
- UI易用性主要体现在可以在Expression Blend中快速设计界面,而且Toolkit可以提供设计时数据以供UI设计师在设计UI更方便的看到很多数据控件的显示。
- 当UI全部改变时,代码可以不改变。
MVVM使得UI与逻辑分离,更加方便进行单元测试,在米聊WP7版中,所有的UI代码都会写单元测试,此外,李政推荐了一些关于MVVM的资源:原出处、微软官方开源类库Prism、MVVM在WP7中的应用实例,推荐使用微软内部开发Windows Phone 7在使用的Framework以及使用介绍。
在用户界面选择上,WP7上存在两种界面控件,Panorama和Pivot:
- Panorama强调多种数据源的聚合,具有一副大于屏幕大小的底图,用户可以通过轻击和平移来选择不同的信息,呈现当前item的时候,同时也显示旁边item的一部分信息,Windows Phone中内置的People和Music+Videos界面就是典型的案例。
- Pivot控件用来过滤大量的数据集,与Tab控件很像,在Windows Phone内置的功能中,E-Mail、Message和Calendar功能就是Pivot的一个应用。
鉴于以上特点,米聊最终选择的界面方案为Panorama。在性能方面,李政给出了自己的建议:
- 不要在模拟器上测试性能,模拟器通常比真机快2-3倍。
- 永远不要在UI thread 做耗时很长的事情,会让应用程序没有响应。
- 阅读User Experience Design Guidelines,按照这里的原则设计应用程序会解决很多性能上的问题。
- 永远不要猜测性能的瓶颈,测量一下。
另外,启动性能可以做到的优化有:使用启动页面,拆成一个个小的dll,在启动时可以减少加载的dll的数量,图片,XML等文件设为Content,可以减小dll文件的大小;通过在表中增加版本号,共享DataContext等方法还可提升本地数据库的性能;还要注意内存泄露以及UI性能,关于提升UI性能的建议有:
- 使用Performance Progressbar而不是WP7 SDK 自带的Progressbar。
- 如果需要一个列表并且里面有很多图片时,选择使用DeferredLoadListBox。
- Data Binding 的性能问题
- Converter 会显著影响性能,避免使用。
- 使用代码创建UI比DataTemplate要高效
在最后,李政还建议开发者使用错误报告,建议关注每天都在运行的程序,可参考文章:Error Reporting on Windows Phone 7。
在问答环节,李政回答了网友的提问,详细信息如下:
问:老师好,关于近期最热门的:“现有WP7设备都不能升级到WP8”,这个问题怎么看?另外,WP8和WP7.8把开始屏幕中的metro界面改的更加复杂,对于这个问题,您怎么看?
答:1.现在的WP7设备主要是因为硬件达不到WP8的要求,现在WP7的设备都是单核的。微软选择在WP8上和windows 8采用相同的架构,以及可以使用native code 共享代码,让开发者可以不抛弃以前的代码,到这一步Windows Phone才真正有了跟iPhone和Android抗衡的实力。2. Metro的问题,我个人是更喜欢这种灵巧的布局了,可以摆放更多的东西在主页上,现在的metro快太大,摆不了几个。问:随着微软发布WP8,并且现有WP7不能升级到WP8,由基于WP7应用开发转向WP8应用开发有哪些问题呢?
答:现有的WP7的应用程序都可以直接在WP8上运行。在一个适当的时候把现有的应用的底层代码用native code重写,以支持WP8 和 Windows 8 也是个不错的选择。问:Windows Phone的Socket Api没有bind和linsten? 那怎么监听一个数据送达的事件?网上的例子貌似都是开一个线程去死循环接受。 而且那个还真是无限执行的死循环。不是阻塞等待的。 电脑的CPU立马飙上去了。更不要说手机了。 求问怎么能监听一个端口的信息到达呢?
答:不需要死循环来等待,可以起一个线程,来异步等待,用SocketAsyncEventArgs,可以参考这里的内容:点击查看。问:WP7里有没像WPF中timer控件一样的定时控件或者其它能实现定时功能的东西啊?
答:WP7 里没有定时器控件,但是有相应的定时器类,DispatcherTimer和Timer可以使用。这里也有Timers的介绍:http://msdn.microsoft.com/en-us/library/zdzx8wx8。问:定义了一个listbox里面<ListBox.ItemTemplate><DataTemplate><StackPanel>里面有个textblock我想在cs里面获取到textblock里面的text值,请问是怎么获取的?还有选中某一项的时候那一项会一直处于选中状态,直到选其他项的时候才会改变,想要选中后改为不选中状态,就是跟我们的按钮是一样 点击后会变回非点击状态?
答:你可以参考这篇文章,它详细写了怎么找到itemtemplate 里的控件:http://www.windowsphonegeek.com/tips/how-to-access-a-control-placed-inside-listbox-itemtemplate-in-wp7。
关于本期讲师
李政,微博账号@-李政-,小米科技米聊Windows Phone团队研发负责人,曾就职于微软负责Lync Android平台的研发工作。对Windows Phone和Windows 8相关技术有着浓厚的兴趣,致力于Windows Phone和Windows 8平台开发技术的研究。
关于专家讲坛
天翼空间开发者社区专家讲坛是天翼空间开发者社区(www.189works.com)2012年针对开发者推出的一项提升专业能力的系列讲座,每周四晚,邀请移动互联网开发领域的权威专家,通过语音频道专题讲座,线上论坛访谈,以及微博、QQ群线上同步直播的形式,为社区的开发者用户提供系统的技术讲座,答疑,以及运营知识方面的培训。
往期内容回顾
关于专家讲坛更多详情,请浏览官方网站。InfoQ也会对后续的活动进行跟踪报道。
关于社区活动的更多详情,欢迎查看InfoQ维护的社区活动日历,也欢迎关注InfoQ官网微博(@InfoQ),获取实时的活动信息!