民族

民族Android开发经历说-很少有人会告诉你的Android开发基本常识

6 10月 , 2018  

以《山海经》里光怪陆离的炎黄大地,古人像历劫一样,翻山越岭,从一个派到其他一个派,山河经随着他们的脚印渐次开展。山被躲藏各处小国命名标志,“以貌取人”如三篇国、贯胸国;怪异如“人面鱼神”的互人国,“其民皆卵生”的卵民国;熟悉而《三生三大地十里桃花》的青丘、昆仑虚,《青云志》的空桑山,《花千骨》里的长留。山海之内,视力所与所在八荒皆奇珍异兽:所特别茎叶为珍珠的老三株树;号称“凡其所用,其味尽存”的凤鸟卵和甘露;好骂人的狒狒“山膏”,叫声像小孩的吃人好东西。而当然所长诸物,不论花石草木、飞禽走兽,都能自它身上找到点用,有不可思议而吃之不迷路、不饥饿的奇功妙效,也起好如现代人一般无二的消化不良、失眠、长皱纹和痔疮。

软件开发流程

一个总体的软件开发流程离开不起来策划、交互、视觉、软件、测试、维护及营业就七单环节,这七只环节并无是孤立的,它们是支付同缓成功产品之前提,但各一样桩为还好形成一个课,是一个独门的岗位,随着高效开发的流行,以及到了经验也上的时日,现代软件开发更多的凡注重效率与高速,而未是老实巴交的比如这些开销流程,比如软件开发的职务不再单独是单技术岗位,它需去参与前期的设计及评审、可以当视觉及彼此方面提出自己之看法,在出的长河中待自测程序尽快缓解现存问题,运营与维护的进程被为欲软件之扶植。可见现代软件开发对开发者的归纳素质(这并无是facebook所云的全栈工程师)越来越强,自称为码农或者程序猿显然是不成立之,因为是过程是脑力累和体力脑动并存,称呼自己为工程师显得越来越合理。

  • 策划:需收集(通过用户调研、灰度发布、大数目解析、竞品分析、领导打首等方式得到需求)、需求整理(将需要分类、划分优先级等)、将要求变换成解决方案(输出设计文档);

  • 交互:打心理学(利用性之通病)、人性化(心智)、个性化的角度将解决方案转换成可彼此的效益及界面(需要输出交互文档),比如加载等待、消息提示、页面布局、页面内和页面间的互相逻辑、页面切换动画等等,这个进程遭到貌似会采用Axure或者PowerPoint来做交互文档;

  • 视觉:因交互图,使用PhotoShop来举行视觉效果,在Android上的图片格式大多是png和jpg,对于欲屏幕适配,程序同时顺应做屏幕适配的地方得采用九图,格式为*.9.png。

  • 软件:依据视觉与互作用将需要转化为实际的兑现,在贯彻之进程中恐怕会见坐要求、交互或者视觉的改变造成软件实现的变更,因为策划、交互、视觉这每一个环还或会见生出消息失真的情景,或者是由于市场环境的更动、获取信息不足够标准、领导打首等等情况导致软件始终处于被动状态,所以现在会提倡很快开发、结对编程、次第设计、同行评审、单元测试来增进程序的八面玲珑与稳定;

  • 测试:软件上而相互的正统后,需要拿只是交互的顺序提供测试,其中灰度发布(用户测试)、自测(开发自测)、SQA(品质保证)都算测试;

  • 保护和营业:通过测试程序上稳定标准后,软件就足以上线了,软件上线后,需要去保护,用户举报的题目如立马化解、用户有疑点要马上解答;根据后台统计信息、抓住可运营的节、民族文化需要举行运营来增进用户以产品之粘度,让更多的用户了解、使用产品都是运营该做的。

注:

  • 好翻此答案了解一个APP从创意到上线的实际流程,支出一个APP有差不多麻烦?

  • 好翻笔戈科技之立即首文章了解一个部手机(平板或任何电子产品也多)的出世需要怎么样环节,一个部手机的出生过程

鲁迅先生说:“昔之新民,见天地万物,变异不常,其列现象,又由人力所能够以上,则打造众说盖说明的。凡所说,今谓之神话。”这便是胡编乱造和美好神话里的别。即使不如好莱坞科幻大片一般情节丰富,无法再现的创世神话却是咱们在长久到无合适记载的一时里极其靠近亦真也幻为数不多的见证,只盖这卖独一无二。

Android应用开发第三正在解决方案

产图也Android应用开发第三方解决方案汇总,有些可以凭第三正值平台搞定的尽管尽可能不要自己折腾,一凡是可节省成本,二凡公没有人家专业,原文链接:Android应用开发第三方解决方案

民族 1

其三着解决方案

修被描写的百状态未定、万物最猖獗繁盛的时代,只比较爱德华·蒙克画里的世界再度奇特扭曲。那些故事里生精怪难以理解,有荒唐难以承受,却又因该明确的编色彩,读起来津津有味却不会见怀有悖于人道主义精神的不良情绪。叙述上敢奔放,毫不忌讳,看无来丝毫底遮羞偏袒。这部广为流传的奇幻九州志是太美妙的魔幻巨制蓝本,在咱们心坎蒙下一致发渴望魔幻的种子,保存着对上古时的好多想。《山海经》诞生后连发展,依旧以宏观年以后的今日起回响。袁珂先生于诠释中将不同出处一一作比,现发出神话留在我们身上的划痕。读《山海经全译》,从相视角到语言文字,其表现出底社会风气无不令人称奇,叫人好生同试探究竟的欲念。书中之奇名怪物,虽没有多少是自我此古文渣读的来的,却也道莫名的习,植物名如桃枝、蓇蓉、杜衡、藷藇、秦椒、亹冬、扶桑、薰华草,动听的字在唇齿相撞间的音频,是华夏民族都能体味的熟稔。语言学理论中发出看语言应用决定想方式,如此足见起发生这些名字的雅人清致。

建议

  • 尽心尽力阅读官文档,这才是原汁原味、不失真的开发指导;

  • 纵使你看规划程序是浪费时间,你只是爱写序,至少你吗得用思想导图理清思路,思维导图对于帮忙您懂设计文档、理清思路有大十分之拉扯;

  • 无须因此Intent传递大量之多少,这出或引致ANR或者报那个;

  • 于离页面后,系统不必然会就履行onDestory方法,如果你当onDestory方法里做关闭文件、释放内存的操作可能出现退出程序同时就进入时,由于用还初始化这些信导致代码重入的大;

  • 在反JNI后,运行程序之前记得卸载掉就设置于模拟器或者真机上之该次,如果直白运行,android不会见load最新编译的so,也即无克立刻看到修改后底功效;

  • 代码至少每天备份一不善,或者是一揽子一个意义就备份一蹩脚,不要堆放后一次性备份,因为于公的代码来问题亟需回溯代码时你得从服务器上重复取代码,同时也得以免代码不是新型导致最后与其他人合并时无清楚改了哪些地方;

  • 以打印信息封装成一个办法,用一个标明位控制是是法的方法体是否用执行,这样在由debug版释放到release版本时,不需要傻傻地平等行一行地去丢代码,你只是需要转移标志位之价就足以了;

  • 对有返回值的JNI函数,即使你切莫回外价值,用NDK编译JNI的时光吗未见面报错,所以在写JNI代码的时,一定要细检查代码;

  • JNI频繁读写文件操作会影响程序的运转性能,可以考虑一次性在内存中申请一块老内存作为缓存空间,用这种空间更换时间之不二法门得以大大提高程序的运转效率;

  • 毫无指望类的finalize方法去处理要回收及销毁之干活,因为finalize是网回调的点子,调用时机不可预见,切记;

  • 利用文件流、Cursor时,使用完毕晚记忆一定要是关闭,否则可能导致内存泄漏,严重的气象恐怕引发程序崩溃;

  • 先利用Google搜索引擎(少用百度),如果不可知健康下Google搜索引擎建议通过代办、VPN、修改hosts文本等方式搭建梯子。这里提供一个免费之谷歌搜索引擎

  • 对于不需要动用硬件加速的activity(没有动画效果、视频播放以及各种多媒体文件的操作都得以合硬件加速),在AndroidManifest.xml文件被经“android:hardwareAccelerated=”false””关掉硬件加速可节省下内存;

  • 对此要横竖屏转换的使,又无思量当横竖屏切换的早晚又跑onCreate方法,可以当AndroidManifest.xml文件被对应之Activity标签下调用“android:configChanges=”screenSize|orientation””;

  • 为了减轻应用程序主进程的内存压力,对于耗内存比较多之界面(比如视频播放界面、flash播放界面等),可以以AndroidManifest.xml文件中对应之Activity标签下调用“android:process=”.processname””单开一个进程,但在离者界面的时肯定要是以拖欠界面的onDestory方法吃调用System的kill方法来大掉该过程;

  • 于res/values/arrays.xml文件中定义之单个数组的因素个数不宜过那个,过大会导致加载数据经常充分慢,有时候你待采用数组资源时数来或还尚未加载成功;

  • 一个Activity中最为耗费内存的凡activity的背景(多数状况如此,特别是于分辨率很要命的机,一个界面的背景竟下来还要好几兆内存),所以在程序界面较多时,可以设想用图片转换成为静态的drawable,然后多个activity共用当下同张背景图;

  • 得经过也application、activity自定义主题的方来关闭多接触触摸功能,只待以起定义的主题下补充加这半个标签:

      <item name="android:windowEnableSplitTouch">false</item>
      <item name="android:splitMotionEvents">false</item>
    
  • 森嬉戏上时,播放的片头动画多数凡是一个视频文件;

  • Android单个dex文件之方式数不可知超越65536单,android使用多只dex能否避开65536办法数限制?

  • 运用模拟器genymotion取而代之android自带模拟器(它要虚拟机vituralbox的支持,不过官网曾提供了一个集成虚拟机的安包了,直接下载下来安装即可),可以大大提高使用模拟器的体验(流畅、快),它吧可以因插件的款式集成以Eclipse中,当时是视频教程

  • 受Application或者activity设置由定义主题时,最好不要设置也全透明,否则在activity按Home键回退到桌面的时段力量大渣;

  • 一旦你用取消toast显示的作用,在一个类似吃你才需要实例化该类一不良(也就是说将Toast定义成一个大局的积极分子变量),这样您就是得调用mToast.cancel()了,我把它写成了一个静态类:

      public class ToastUtils {
          private ToastUtils( ){
    
          }
    
          public static void showToast( Context context, String toast ){
              if( null == mToast ){
                  mToast = Toast.makeText( context, toast, Toast.LENGTH_LONG );
              }else{
                  mToast.setText( toast );
              }
    
              mToast.show( );
          }
    
          public static void cancel( ){
              if( null != mToast ){
                  mToast.cancel( );
              }
          }
    
          public static Toast mToast = null;
      }
    
  • 汝可以定义一个静态类来兑现防止按钮被重复点击导致更执行同样截代码的题材:

      /**
       * 按钮重复点击
       * 
       * */
      public class BtnClickUtils {
          private BtnClickUtils( ){
    
          }           
    
          public static boolean isFastDoubleClick() {
              long time = System.currentTimeMillis();
              long timeD = time - mLastClickTime;
              if ( 0 < timeD && timeD < 1000) {   
                  return true;   
              }
    
              mLastClickTime = time;
    
              return false;   
          }
    
          private static long mLastClickTime = 0;
      }
    
  • 座落apk的assets或者raw目录下之数据文件最好做加密处理,在用使用的上才解密,这样好免在apk被人家破解时数吧为破解的题材;

  • 绝不要再次activity的onCreate方法中调用popupwindow的show方法,有或由activity没有了初始化导致程序非常(android.view.WindowManager$BadTokenException:
    Unable to add window — token null is not
    valid
    ),如果非要于一进activity就显示popupwindow,建议用handler.post、View.postDelay来拍卖;

  • 对自定义View,在构造方法里面凡是得到不至视图的有余高的(此时获取丰富宽都为0),需要以onMeasure方法中要么跑了onMeasure方法后才能够获得到视图的有钱高,不过你可经过以构造方法里面强制测量视图的富足高来贯彻在构造方法里抱视图的丰足高信息,具体见MeasureSpec介绍和动详解

  • 若是你觉得以安装Eclipse后尚用配置android开发条件十分烦,你得直接利用ADT
    Bundle,它是一个懒人套餐,下载下来就是足以为此了,可以以这里下载。

  • 起时光探访阿里技术嘉年华、InfoQ演讲和访谈、Google
    IO视频,可以学到片化解问题、做老大类别之经验。

  • 当使用被卡通比较多,并且动画都是由此图形来切换的时光,可以考虑借用Cocos的敏感表单合计,这样即便得免图片命名的烦恼。

读书之经过里不自觉的针对性古人抱出追寻的态势,尽力撇开“未开”的满和偏见,他们先天地知道和当相处。《山海经》记录的古灵精怪里还显出着雷同道朴拙,对本来神圣之信仰。那种对周遭世界纯粹而异的量近乎孩童,没有更可随,没有先例可借鉴,没有惯性要打破,依靠最老的神志感知身处的社会风气。一切都是全新的,自由自在做世界的探索者,那形态各异、千奇百怪的解读背后是可贵的义气和奇怪。世界在她们之眼底完全两样,今人看来觉得痴狂,却是当时恣意妄为的想像给了俺们得意的旁一样种植面相,奇形怪状却花。古人用典型的想象力创造有要万花筒中花的社会风气,真真假假不根本,除去自然社会对的研究要,于普通人而言,它撕开了同等志缝,那是每个脑袋里都幻想了的世界,任由我们的想象发挥润色,真实吗还无关紧要。

本子管理介绍

每当比充分之软件开发过程遭到,可能发差不多独软件工程师同时开发一个品种之状,比如来负担读取数据、获取网络数据等API封装的,有负程序架构的,有背上层界面实现的,为了能最终编译一个完结的次第下,需要以代码整合,这个时节太有益之不二法门就是是运用本管理工具,固定时间上传(比如每天、没改变一个功力等等),这样能实时保证服务器上之代码是太完好、最新的,也得以避由于自然灾害、电脑坏导致本地电脑挂掉损失掉代码的题材。

大规模的本管理工具有SVN和Git,我啊采取了CVS,关于本管理工具的介绍参见:

版本控制

版本控制系统的抉择的路

git教程

git简易指南

注:对于windows用户来说,建议以乌龟壳系列之版本控制客户端,使用github的情人可以动用github
for windows客户端:

tortoisegit

tortoisecvs

tortoisesvn

github for
windows

叫当今荧屏大行其道的神话构想与感人传说勾的好奇心大发,于是奉承了《山海经全译》(2016袁珂先生译注版),尝试辨认这虚幻背后的形容。然而各路帝王神仙出处极多,脉络复杂,时间难究,想理出单所以然来也是徒劳无功,索性放弃,安安心心把自己抛弃进书中形容的愚昧天地。

编译

平常我们因而Eclipse或者Android
Studio开发android程序时,只需要周转程序即使好在模拟器或者机器及运行程序了,但为确保代码的完整性、能够在服务器上编译,需要经过编译工具将代码编译成apk,常见的编译工具有:ant、gradle,但当下半种编译工具还是索要经手动敲命令来就编译功能(当然你为堪团结写脚本来实现编译自动化),jenkins是一个不停集成的家伙,通过它们好代码克隆、编译和程序加密自动化,其实它们吗是经过批处理来兑现的,ant、gradle和jenkins的切切实实用法机关谷歌,使用起来非常粗略,目前android
studio和github上无数力量都是通过gradle来编译的。

以及祖先们对比,一定水平达我们是懈怠且木的。我们的社会风气由成体系的天文地理医学科技支持,接纳了先驱搭建好之框架,怀揣在“世界就是是以此法”的自用。或许,与无愿意承认自己的愚昧相比,大概这样是构建自我与世风关系最好轻松的法子。崇尚科技之一代,我们仍然身处困境,绝非所向披靡、无所不能。只是比较古人,少了千篇一律种“苦中作乐”的大方。自然灾祸从未消弭,古人却说有神“司日月之长”,有精明“行日月星辰之实践不行”,有精明“视为昼,瞑为夜,吹为冬,呼为夏,不饮,不吃请,不息,息为风,身长千里”,“曀鸣生岁十发生第二”,还有回不失之怨念应龙与送不倒的傲娇旱女……这些性感恢弘、天马行空的想像在上古一时先人和混沌世界艰苦卓绝的久远奋斗里口耳相传,让人当可爱,也可歌、可敬。

Android开发资源

参见我的旁一样首文章:Android开发者网址导航

记忆深刻的还有古人真的诡异的貌能力。魑魅魍魉横冲直撞,各路牛鬼蛇神皆借助已熟识的物种来描写,虽也及时认知程度所界定,却别有滋味,引人无限遐想。有人品以今天之物种来对待,反而没有了智慧。“女娲之肠…横道而处”意为“一坨肠子一样的神横淌在路面上”,这镜头实在让人未敢想象;“女丑有大蟹”即“神女丑尸找了平就怪河蟹当因为骑”:骑在只恶的蟹雄赳赳气昂昂的滑稽神仙,古人之好玩感当真举世无双;有非常东西“反踵,见人笑也笑,唇蔽其面”,是种脚掌翻转而深,笑起来吻把脸都挡住住的雅武器;如今代表爱情的比翼鸟,却是单翅单眼,还发只稍浪漫的名字“蛮蛮”;还时有发生其它海洋生物如果半边身体的一臂民、没有骨头的人头与居住在一道门间的异形……似乎大自然成全了古人全部之野趣。

工具推荐

  • 代码对比:Beyond
    compare

  • 屏幕取色:ColorPix

  • 梯子:红杏

  • 思维导图:
    mindmanager

  • 在线工具:在线工具

专业术语介绍

以下说明了是我的掌握,详细分解可机关谷歌。

  • 本迭代:据要求优先级,在保证基本功能OK后连连开发与提升,这样能够降低软件开发的风险,并且能及时化解用户反馈的问题,船小好掉头嘛;

  • 高效开发:有些步快蒸发,大概意思就是是无须过度重视文档,要倚重公开交流,能够以贯彻时高保真的还原用户的需要状况,并且能很快地化解用户之要求。

  • 单元测试:白盒测试的平等栽,对中心措施通过描写程序来测试自己之次,单元测试的目的是让你生出发现地降落程序中的耦合,保证各一个法还是不过小单元,但眼看对测试程序逻辑是无帮助,这是本人要好之解。。。

  • 灰度发布:事先找找一组成部分用户来采取将发布的次第(这部分用户可是轻易抽取、制定年龄段、指定地方还是经某种方式了解他是虎虎有生气用户),在测试的长河中吃与用户一点功利给用户写用户体验报告、反馈问题相当办法来发现先后在的题目同短处;

  • DA统计:呢吃后台统计,通过以先后中埋点的艺术,在发出网的情状下用用户之操作行为同数据上传到后台,将每个用户之信息都达到污染回到就算叫老数量,通过建模对这些数据解析就是让大数目解析。

  • 开放平台:准分享至QQ空间、分享到微信、讯飞语音、友盟的后台统计、天气、地图之类都叫作开放平台,它提供了片绽放之接口给开发者,方便开发者使用她的劳务,开放平台多数劳务还是免费之,但有时候也说不定无安宁,比如用之口丢它本就活不下去了,然后就是从未有过然后了。

  • 同行评审:公的同行和而同探访您的代码,发现是否出题目;

  • 结对编程:于描绘代码的经过中,有只人口以在公沿或者您坐于人家干,编写边谈论,降低程序出现逻辑与初级错误的票房价值。

正文介绍Android开发进程遭到的有基本常识,大多是局部流程、专业术语和解决问题之法子等。

解决bug的方法

为了写这无异于件我特意在知乎上提了一个题目:

公发什么解决bug的技术?

当懂怎么迅速解决bug之前,你得明白呀是bug。没有水到渠成策划、交互、视觉要求的机能,这不给bug,这叫功能缺陷;一个效益就后无可知健康下与否未深受bug,因为它向还不曾达到而测试的正经。我道当你的次上可测试标准下发现的题目才叫bug。综合我自己解决bug的涉与知乎上之回,总结常见的化解bug的计有(你想只要快速解决bug的前提是你能够迅速稳定及缺陷所当的职务,所以以下措施多数摆的是怎快速定位问题,至于真的解决bug,需要您协调修改程序才行):

  • 断点调试:

以Eclipse为例:

1、打断点:

(1)打断点:

民族 2

打断点

(2)清除断点:

民族 3

打消断点

2、启动调试模式的点滴栽方法:

(1)通过debug as启动调试程序:右键工程名–>Debug AS –>Android
Application –>模拟器或者确实时弹出……watching for the
debugger……的唤醒框,不要点击等待其自行消失 –>
此时既上调试模式,操作程序到达打断点的地方。

(2)在程序运行过程遭到,在DDMS视图下选中设调节的次序,启动调试模式:

民族 4

DDMS视图进入调试模式

3、调试:请自行尝试F5、F6、F7、F8这几乎独调剂的快捷键;

4、watch成员变量:在调试之经过中,比如以履行for、while、do
while循环、递归、系统回调等主次时好由此watch来观察成员变量或者措施返回值的生成情况,watch的措施:

民族 5

watch

注:再度多关于以Eclipse IDE中调试Android程序的文化要参见:Android
eclipse中程序调试

  • 打印:

打印调试之主意对循环、异步加载、递归、JNI等代码段很有因此,特别是在循环中,在循环次数非常充分时,通过打断点调试显然是平项吃力的事务,这时候打印就亮更“智能”了,我一般会经过下封装的打印调试类来输出打印信息,这个仿佛可打印print、log、行号、文件称、StrictMode等信息,当不待打印信息时,只需要以DEBUG_MODE改为false就足以了:

    import android.content.Context;
    import android.os.StrictMode;
    import android.util.Log;
    import android.widget.Toast;

    /**
     * 调试打印类
     * 
     * */
    public class DebugUtils{
        private DebugUtils( ){

        }

        public static void println( String printInfo ){
            if( Debug.DEBUG_MODE && null != printInfo ){
                System.out.println( printInfo );
            }
        }

        public static void print( String printInfo ){
            if( Debug.DEBUG_MODE && null != printInfo ){
                System.out.print( printInfo );
            }
        }

        public static void printLogI( String logInfo ){
            printLogI( TAG, logInfo );
        }

        public static void printLogI( String tag, String logInfo ){
            if( Debug.DEBUG_MODE && null != tag && null != logInfo ){
                Log.i( tag, logInfo );
            }
        }

        public static void printLogE( String logInfo ){
            printLogE( TAG, logInfo );
        }

        public static void printLogE( String tag, String logInfo ){
            if( Debug.DEBUG_MODE && null != tag && null != logInfo ){
                Log.e( tag, logInfo );
            }
        }

        public static void printLogW( String logInfo ){
            printLogW( TAG, logInfo );
        }

        public static void printLogW( String tag, String logInfo ){
            if( Debug.DEBUG_MODE && null != tag && null != logInfo ){
                Log.w( tag, logInfo );
            }
        }

        public static void printLogD( String logInfo ){
            printLogD( TAG, logInfo );
        }

        public static void printLogD( String tag, String logInfo ){
            if( Debug.DEBUG_MODE && null != tag && null != logInfo ){
                Log.d( tag, logInfo );
            }
        }

        public static void printLogV( String logInfo ){
            printLogV( TAG, logInfo );
        }

        public static void printLogV( String tag, String logInfo ){
            if( Debug.DEBUG_MODE && null != tag || null != logInfo ){
                Log.v( tag, logInfo );
            }
        }

        public static void printLogWtf( String logInfo ){
            printLogWtf( TAG, logInfo );
        }

        public static void printLogWtf( String tag, String logInfo ){
            if( Debug.DEBUG_MODE && null != tag && null != logInfo ){
                Log.wtf( tag, logInfo );
            }
        }

        public static void showToast( Context context, String toastInfo ){
            if( null != context && null != toastInfo ){
                Toast.makeText( context, toastInfo, Toast.LENGTH_LONG ).show( );
            }
        }

        public static void showToast( Context context, String toastInfo, int timeLen ){
            if( null != context && null != toastInfo && ( timeLen > 0 ) ){
                Toast.makeText( context, toastInfo, timeLen ).show( );
            }
        }

        public static void printBaseInfo( ){
            if( Debug.DEBUG_MODE ){
                StringBuffer strBuffer = new StringBuffer( );
                StackTraceElement[ ] stackTrace = new Throwable( ).getStackTrace( );

                strBuffer.append( "; class:" ).append( stackTrace[ 1 ].getClassName( ) )
                        .append( "; method:" ).append( stackTrace[ 1 ].getMethodName( ) )
                        .append( "; number:" ).append( stackTrace[ 1 ].getLineNumber( ) )
                        .append( "; fileName:" ).append( stackTrace[ 1 ].getFileName( ) );

                println( strBuffer.toString( ) );
            }
        }

        public static void printFileNameAndLinerNumber( ){
            if( Debug.DEBUG_MODE ){
                StringBuffer strBuffer = new StringBuffer( );
                StackTraceElement[ ] stackTrace = new Throwable( ).getStackTrace( );

                strBuffer.append( "; fileName:" ).append( stackTrace[ 1 ].getFileName( ) )
                        .append( "; number:" ).append( stackTrace[ 1 ].getLineNumber( ) );

                println( strBuffer.toString( ) );
            }
        }

        public static int printLineNumber( ){
            if( Debug.DEBUG_MODE ){
                StringBuffer strBuffer = new StringBuffer( );
                StackTraceElement[ ] stackTrace = new Throwable( ).getStackTrace( );

                strBuffer.append( "; number:" ).append( stackTrace[ 1 ].getLineNumber( ) );

                println( strBuffer.toString( ) );
                return stackTrace[ 1 ].getLineNumber( );
            }else{
                return 0;
            }
        }

        public static void printMethod( ){
            if( Debug.DEBUG_MODE ){
                StringBuffer strBuffer = new StringBuffer( );
                StackTraceElement[ ] stackTrace = new Throwable( ).getStackTrace( );

                strBuffer.append( "; number:" ).append( stackTrace[ 1 ].getMethodName( ) );

                println( strBuffer.toString( ) );
            }
        }

        public static void printFileNameAndLinerNumber( String printInfo ){
            if( null == printInfo || !Debug.DEBUG_MODE ){
                return;
            }
            StringBuffer strBuffer = new StringBuffer( );
            StackTraceElement[ ] stackTrace = new Throwable( ).getStackTrace( );

            strBuffer.append( "; fileName:" ).append( stackTrace[ 1 ].getFileName( ) )
                    .append( "; number:" ).append( stackTrace[ 1 ].getLineNumber( ) ).append( "\n" )
                    .append( ( null != printInfo ) ? printInfo : "" );

            println( strBuffer.toString( ) );
        }

        public static void showStrictMode( ) {
            if (DebugUtils.Debug.DEBUG_MODE) {
                StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
                        .detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build());
                StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
                        .detectLeakedSqlLiteObjects().detectLeakedClosableObjects().penaltyLog().penaltyDeath().build());
            }
        }

        public static void d(String tag, String msg){
            if(DebugUtils.Debug.DEBUG_MODE){
                Log.d(tag, msg);
            }
        }

        public class Debug{
            public static final boolean DEBUG_MODE = true;
        }

        public static final String TAG = "Debug";
    }
  • 目视法:

旋即可吃code
review,但是非顶依仗谱,因为人的肥力毕竟有限,有时候你多敲一个分店,缩进不对都起或造成程序出现问题,但以代码量较少时是一个高效率的计。

  • 自动化测试:

Android的自动化测试(分白盒测试与黑盒测试)工具有:monkey、Robotium、Appium、云端测试(比如testin),具体用法而参见:

android实用测试方法之Monkey与MonkeyRunner

Robotium

Testin

Appium中文课

  • 排除法:

调节、打印、目视这三种艺术可给得复现的问题,对于随意问题(实际上不设有任意问题,只是问题非那么好复现而已),比如以线程、音频播放、AnsynTask、Timer切换或者终止时刚开了相应地人为操作造成出现灵异现象。这时候可以由此排除法来排查问题,具体的法子是率先大概定位及起问题的职,然后以代码一段同样段落地诠释,观察程序现象,逐步缩小出现问题之限。

问问的明白

绝大多数办事都是盖结果吗导向的,特别是软件开发这个职业,绩效考核、KPI这些还是当考核你工作之收获,所以做事双重多地是需要你解决问题之力量,至于上是业务,还是当工作之外的光阴去举行吧。对于加强解决问题能力我有点儿单建议:

  • 学会读书及思索:学的历程遭到而广度与纵深并存,Android应用开发自己对技术基础的渴求无强(因为许多脚的东西还于google、框架、开源代码给封装起来了,多数时候你只需要看ReadMe或者API知道怎么用便可以了),更多地是当您遇到问题之上知道这问题会由此什么方法和方来解决。书如扣押,但基本上逛逛论坛、QQ群、Github、StackOverflow、CSDN博客专栏对友好尚且是造福的。

  • 学会提问:若身边有不少资源,比如同事、StackOverflow、QQ技术交流群、搜索引擎,当您遇见问题之时刻完全好下身边的资源来缓解遇到的问题,如果一个题材在一个小时内自己还非克化解它们,我就会经过搜寻引擎、Github、QQ技术交流群、同事、StackOverflow(以上排序是本事先级列的)来缓解它们。如果您待好的答案而就是需要发出好之提问,特别是在QQ群或者论坛,在提问的经过被得反映出您的思想,能够透过搜寻引擎解决之问题坚决不问别人,这是针对旁人的珍视,在这边推荐几独链接,认真看会针对君来可观的提携:

如何用好 Google
等搜寻引擎?

程序员应该怎么样提问?

问问的灵性

Smart
Questions

, , , , , , , , , ,


相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图