小米李政谈如何构建高质量的 WP7 应用程序

  • 贾国清

2012 年 6 月 29 日

话题:性能调优语言 & 开发

在 6 月 28 日,由天翼空间·开发者工厂主办,InfoQ 协助策划的第十期专家讲坛活动上,来自小米科技米聊团队研发负责人李政( @- 李政 - )就如何开发高质量的 Windows Phone 应用的问题与大家进行了分享,内容涉及应用程序架构、用户界面、性能以及错误报告等。

Windows Phone 7 开发实例——构建高质量的 WP7 应用程序讲稿下载

本次分享主要分为产品设计、应用程序架构、用户界面、性能以及错误报告几个部分。

在应用程序架构部分,李政提到在 WP7 版米聊中,使用到了 MVVM(Model-View-ViewModel)模式:

  1. 将 Mode 和 View 分离,方便建立简洁、易维护、易扩展的应用程序。
  2. 可测试性强(View 和 Model 分离可以针对 Model 进行单元测试)、UI 的易用性强。
  3. UI 易用性主要体现在可以在 Expression Blend 中快速设计界面,而且 Toolkit 可以提供设计时数据以供 UI 设计师在设计 UI 更方便的看到很多数据控件的显示。
  4. 当 UI 全部改变时,代码可以不改变。

MVVM 使得 UI 与逻辑分离,更加方便进行单元测试,在米聊 WP7 版中,所有的 UI 代码都会写单元测试,此外,李政推荐了一些关于 MVVM 的资源:原出处微软官方开源类库 PrismMVVM 在 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),获取实时的活动信息!

性能调优语言 & 开发