Android开发中遇到的大坑

来源:互联网 发布:淘宝怎么买弹簧刀 编辑:程序博客网 时间:2024/06/05 03:18

从去年到现在开发公司2代app已经有大半年的时间,这个过程中主导了从产品需求,设计,架构框架搭建,开发,测试,fix bug,上线这一系列的流程,这过程中遇到了无数的坑,但是秉着自己挖的坑,哭着也要把它填满的原则,一路走来总算是沿着自己越来月满意的目标在接近,对很多方面有了更深刻的理解。这里总结一下。

  1. 头号坑:产品的需求和设计,这一点非常重要,由于是创业公司,并且方向是比较新颖的,很少有可以效仿的前人。所以很多时候都是大家脑洞大开,甚至是一股脑儿把觉得有用的都加上,UI设计也随意。结果不仅研发耗了大量的时间和精力,而且用户不一定买账,就是你辛辛苦苦做的功能没人用,甚至被人诟病,这是创业公司一定要注意的。要做好这一点,一定要仔细处处从用户的角度考虑,设身处地的思考,产品本身最核心的价值在哪里?哪些功能对于用户来说是最重要和最关心的。如何设计,UI摆放最符合用户习惯,方便用户使用。
  2. 二号坑:一定要迭代开发!作为一个从0开始的创业公司,从0开发到现在,这一点的理解比以前更为深刻。迭代开发不仅仅是开发本身的迭代,更重要的是体现在功能需求上。就是说先想清楚你的产品最核心的价值在哪里,那就先把体现最核心价值的功能做出来,同时具有一定的扩展性,一来是试探市场,快速试错,二来是能够快速开发,三来是可以后面慢慢增加功能,稳步提升软件质量和功能。而绝对不是一开始就把最终的产品的完整形态全部设计出来,就开始埋头开发。在这一点上一定会吃大亏!不仅会消耗很大的精力和时间,而且很有可能会推倒重来,这个时候再去做减法,最终结果是搞得研发部分苦不堪言,而且很有可能会出现情绪,各种撕逼!
  3. 开发本身的一号大坑:尽量不要做本地数据库保存(说明:如果实时性不高,则需要用;如果实时性要求高,则不能用本地数据库),一开始以为这样能够提高读的性能,并且可以玩单机版。结果带来的问题是 1). 开发需要增加大量的精力来维护iOS & Android本地存储和网络之间的数据一致性,这过程中要考虑有网,没有网,有弱网超时的情况…,然后有网络时做同步…否则会带来一系列的问题。2). 还要保证用户在iOS设备与Android设备之间的数据同步问题,不能说你换了手机了数据就不一样了。解决这2个问题的过程简直就是噩梦。
  4. 发版升级安装不成功的问题,这个问题一开始非常头疼,结果发现Android Studio里的generate signed APK和用命令行gradle assembleRelease build出来的签名是不一样的!所以每次还是用命令行多渠道打包发版吧!
  5. 长期处于后台死掉重启用Core Service吧,再次点击app icon重启这个问题用task stack和标志位flag解决。我看到很多公司的app居然有这个问题。
  6. 耗时操作不要在主线程,基本上卡顿啊,反应慢啊,ANR啊等等这些问题,只要去检查一定可以发现主线程中做了耗时操作。解决的办法很简单,放到子线程,然后同步一下就OK了。这个说起来简单,但是在开发的过程中,经常会掉到这个坑里。
  7. 各种网络请求,图片加载,文件上传下载还是尽量都用第三方成熟的库吧,否则自己写会很痛苦,并且出各种问题。
  8. 大坑:智能设备蓝牙的适配,不同的机型各种问题。尽量用第三方库,然后再此基础上就开始各种debug,适配吧!
  9. 关于测试:测试一定要各种机型,N中场景的测试全面覆盖,相信我,很多你认为绝对不会出问题的代码逻辑换了一个手机就可能出问题。就是这么让你抓狂。
  10. 接下来就是一些细节知识点的坑:1)用MPAndroidChart画图,其中有一个滚动MoveViewToX之类的一定要在Chart所在View(如Fragment)可见时操作才有效,否则抓破脑壳都不知道为什么。2)在用Map, List等容器往里面put,add等之前一定要记得先clear,否则一旦多次调用这种init()操作时,会越来越多,经常出这种错,debug半天。3)在for,while循环很容易忘记特定条件下的break,否则赋值会被后面的覆盖,很容易让人看半天郁闷逻辑没错啊。这些看似很容易,但是很容易掉进去,而且一旦掉进去就debug半天的坑。
  11. 关于创业项目方向,最好选择市场足够大的项目,而不是撑死了整个市场只有几个亿的,go to the BIG market!
  12. 后台数据库查询一定不要放在循环里,这样的耗时将会是指数级增长,最长一次发现网络请求达到了38s,一次查询后在内存里做循环立刻降为1s,这是典型的性能优化。app端也是如此。即使必须如此,也应该放在事务里执行。
  13. app端和后台网络的请求接口API本身一定要解耦,不要把UI一堆的东西放在一个接口里,否则将来这些UI只能耦合在一起,一旦分开则API就必须拆分。所以最好是遵循SRP原则。
  14. 有的机型,侧滑退出某个Activity会先出现空屏再回退上级页面的情况,所以还是不做为好。
  15. 华为内部的虚拟按键会遮挡布局,在Manifest相应的Activity里添加android:theme=”@android:style/Theme.Black.NoTitleBar” 即可。或者activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN);
  16. 在做JNI/NDK开发时,碰到传数组参数,数组的值不可以超过512个,否则就会出现丢失数据的问题,遇到这种情况只能把这个用java写。
  17. 网络请求都放到单独的Service中去执行,不要依赖于Activity的任何生命周期,这样Activity finish了,网络操作仍然可以继续,否则必须等到网络操作完了才能关闭窗口。
  18. 最好用git多分支来管理代码,否则如果用SVN的话,在想保留原有版本的基础上出现2个选择分支你都想保留的话,将只能覆盖以前的历史版本,一个分支走到头。
  19. json解析(包括http response json string到本地,还是本地java变成json字符串到服务器)最好用fastjson来把json和java对象mapping起来,速度快,性能好,省时省力。从本质上来讲,json只是一种网络传输格式,客户端和服务器都只需使用java对象:即接到json立马转为java对象然后进行操作,发出网络请求立即把java对象转为json字符串发出去。
  20. 当业务越来越大时,才能体现架构的巨大优势:结构和职责清晰。架构上,横向上进行分层:MVP,便于职责解耦,测试;纵向上按照业务划分为不同的组件module,module之间有modiator跳转,便于并行开发,业务独立,提升效率,排错。
  21. 本地数据库操作用greenDAO来管理,数据库创建,升级,增删查改等操作更加高效。
  22. 当使用TabLayout + ViewPager + Fragment 这种架构时,一定要使用懒加载,优化首次进入页面的速度和滑动的流畅度(UserVisibleHint=true时再加载网络数据和数据库数据),否则加载过多会导致黑屏情况出现。
0 0