这些年在项目开发中遇到过很多困难, 有些在当时觉得很困难, 但是后来回头再看时感觉也没那么难, 所以要在其中找一个最困难的, 好像也不太容易比较.
这里就简单说两个印象最深刻的吧.
第一个是当开始开发时的一个页面嵌套滑动的需求开发, 用在查词结果页的展示, (此处可以展示实景)
难点是要在一个可以侧滑的场景下, 也可以上下滑动, 并且在上下滑动的同时要控制header的展示位置, 当时也是参考了很多实现, 包括, 外部viewpager+内部listview, listview+悬浮header
scrollview+listview 发现都不能很好的实现, 当时自己也是对页面触摸事件分发一知半解, 对嵌套页面的滑动冲突没有实际经验, 所以面对这个问题觉得很头大.
好在最终在借鉴各种方案的前提下, 通过外部scrollview + viewpager+listview的方式实现了, 主要逻辑都在外部的scrollview的dispatchTouchEvent()中,
经过这一两年, 也遇到过一些其他的例子, 现在仍然感觉当时的处理还是比较有道理的.
通过这个需求, 自己对页面事件分发流程的理解也算是更深一步.
第二个要说一个应用换肤的需求, 当时产品提出一个笼统的换肤的要求, 但没有说明具体的方式方法, 我们也是分析研究了几种当时能够想到的方式, 包括主题切换方式实现, 还有通过插件方式提供资源包, 又分为静态预置, 动态获取两种更新方式. 形式上也分为简单资源压缩包, 或者以apk形式形式提供. 而在资源包具体实现上又分为全量包, 和差量包;
这个需求的难点在于前期的这些调研, 需要对每种方案都进行研究, 分析原理, 风险, 并测试流程.
最终考虑到我们的换肤需求, 并没有太多的动态性, 作为我们的应用未来可能也不会qq一样会有第三方提供主题插件, 而且未来的UI变化太大, 也无法提前确定一套颜色+图片的设计框架.
所以最终我们选择了最保守的方案, 只是抽取了应用设计的颜色, 在不同的5个主题下分别定义了这几十种颜色, 而在后期的页面开发中都必须使用这些颜色号, 而不能直接设置具体颜色值.
这样主题切换时, 就会自动呈现不同的颜色主题. 此处可以实景演示.
代码重构: 从最开始的原始结构: activity+ fragment 逐渐过渡到mvp模式开发. 在业务分模块的前提下, 区分model, presenter, view三个部分
其他也有很多难点,包括:
实现兼容的状态栏沉浸式方案, 并且解决因此引起的AdjustResize模式失效. 至今stackoverflow上还有这个问题的讨论, 当时也是查了很多资源, 才解决.
加快应用启动速度, 需求要求我们的查词页面在所有机型上0.5s之内启动完成, 这个为了这个需求费了好大劲, 显示分析页面启动过程中所有的耗时点, 然后重构代码, 延迟加载, 优化布局, 去掉大图片资源, 改为自定义颜色值, 自定义一些布局控件, 减少measure步骤, 等等, 然后再次分析耗时点. 最终基本上在所有手机上实现0.5s内启动. 但很可惜后期的需求又把这个需求覆盖了, 我们现在也提供了启动广告页面展示, 已经不再要求快速启动了. 但仍然在这个过程中, 熟悉了一套优化启动速度的经验.
fragment的引入. 之前的应用版本中没有使用过fragment , 而我们从7.0开始需要一个侧滑菜单, 并且需要支持平板, 所以是一个引入fragment的好契机, 通过引入fragment, 实现了一部分页面的复用逻辑, 像是左侧的侧滑菜单, 在平板上就是常驻的. 实现本身并没有什么难度, 但遇到的问题还是很让人头痛.
一篇博文:http://www.jianshu.com/p/d9143a92ad94
在Activity之外, 还得重新研究fragment的生命周期, 而fragment的生命周期更复杂;
startActivityForResult的返回码需要处理; 在嵌套fragment中收不到这个回调. 新版android已经修复了这个问题
getActivity()返回null; 常发生在内存不足被重启的情况下; 有异步操作没有完成, 而fragment已经detach了. 好的建议是在fragment内部存一个activity实例;
有使会生成两个一样的fragment实例, 给调试带来困难; -- 什么情况下? 内存重启, 具体可以见:http://www.jianshu.com/p/78ec81b42f92//新版android已经修复了这个问题; 能用replace就不要使用hide() show()
popBackStack 不可靠, 容易导致白屏问题; --具体原因是内部的bug, 新版本android 已经修复;
Fragment传参, 需要注意, fragment自动重启时参数为空的情况.建议使用setArguments() 但是一些复杂的自定义类对象, 又做不到.
fragment切换动画不如view切换动画好实现;
形成经验:只有在整个页面都需要复用的时候才考虑使用fragment, 而如果是一些局部显示, 优先考虑使用view . 尽量不要使用嵌套fragment; 配合mvp模式, fragment尽量不参与业务逻辑;
总之要轻度使用fragment;
小说的排版,
需求要支持小说阅读页面点击查词功能, 需要动态计算点击位置对应的单词; 同事又要支持阅读页面点击跳转, 这样在实现时, 需要增加标签支持, 这与前面的点击查词功能有些冲突, 实现时非常头痛.
如何点击取词;
如何在TextView中显示链接, 并相应点击事件.
消息推送:
机型适配, 个别小机型崩溃问题定位.用户修改了字体, 用户root刷机之后崩溃, 还有修改了特殊语言之后的崩溃,
SDK开发;
自动化测试方案: 使用jenkins搭建了一个自动化运行平台, 可以自动执行写好的脚本, 验证核心查词接口的功能,
难点是包括jenkins, robotium, 都没有使用过, 需要从0开始,
客户端页面可被后台随时启动功能. 可以根据需要, 随时通过后台唤起客户端的一个页面, 可以是一个展示网页的页面(此时需要把网页地址作为参数传给客户端), 也可以是客户端已经存在的任何一个页面, 比如一本小说详情页, 一个课程页面, 在需要开展促销活动的时候, 提供跳转到这些页面的能力;
入口是后台推送入口和主页预留的活动入口;
需要实现一种后台可配置的启动字符串机制, 最后确定了通过以个json格式的字符串, 来制定要启动的页面, 和附带相应的参数; 这样客户端所有的页面都不需要修改, 只需要在入口处解析出这个命令字符串, 然后跳转到对应的页面;
遇到的困难是, 有些已有的页面需要很复杂的参数, 甚至是一个bean 对象; 所以在给这些activity准备参数的时候就要通过字符串的形式提供, 然后再解析为bean 对象实例.
从某种意义上来说, 就是定义了一种启动页面的协议.
内存泄漏分析: