通过生命周期来思考软件的健壮性

通过生命周期来思考软件的健壮性_第1张图片
image

概述

在Android开发中,首要面临的就是四大组件的生命周期,通过遵循Activity等组件的生命周期,达到一个应用程序Application运行起来比较稳定。所以我们开发过程中也必须遵循四大组件的生命周期,才能开发出更健壮的应用。避免内存泄漏、应用崩溃、ANR、OOM等异常。

在一个发布在市场上的应用,难免会遇到一些异常,当我们通过日志分析的时候,很多时候其实就是没有妥善处理某些代码,从而导致用户在某些特定使用场景下发生异常。随着问题次数增多,自然而然自己也时刻注意着,然后也总结了关于生命周期的一些规律。其实不仅仅是Android开发,不仅仅是为了遵循四大组件的生命周期而需要做的处理,事实上我们在开发代码的过程中,都要遵循生命周期这个概念,下面说说我的体会。

1、一个变量

我们写代码的时候,变量是最常见的了,比如成员变量、局部变量、参数传递中的变量等等。但我们是否有考虑过一个变量的生命周期,也就是变量从哪里初始化,什么时间被回收,运行在哪个内存模型里面,怎样才能达到更高效的访问,以及在多线程、高并发访问的时候如何做到数据的准确性。这个就要思考一个变量的生命周期了,认识一个变量的生命周期,才更准确的使用一个变量,从而增强代码的健壮性。

2、缓存对象、单例

对于经常需要使用的对象,会考虑使用内存缓存起来,以便需要使用的时候能够更快速的访问,这个被缓存的对象一般会在整个软件的使用周期内都存在。但开发者往往会忽略一些业务场景,比如在切换用户的时候,或者业务需求更换某个服务的时候,如果还继续使用原来的缓存信息,可能会引起一些异常,因为原本的缓存的对象,只服务于原来的用户或者服务。当然这种异常比较容易发现,开发者能够比较快速的发现这种问题,但在开发的时候,也应该多考虑这个缓存对象的生命周期,在什么时候应该考虑重置、消亡这些缓存对象。

3、一个网络请求

我们在开发App的时候,通常会使用异步线程去执行网络请求,获取相应数据然后显示到界面上。但这里结合系统组件的生命周期,或者考虑网络的异常场景的时候,往往有很多工作需要处理。如果没有妥善处理,可能会导致内存泄漏,或者走到错误的执行流程,甚至是程序崩溃。可以通过Fiddler模拟弱网场景,对于执行在线程池里面的网络请求,可以使用FutureTask来跟踪线程的存活以及执行情况从而控制网络,对于Okhttp框架,也可以使用tag标志网络请求,cancelTag()可以取消当前网络的执行。对于多个并发请求,跟踪处理网络线程的执行显得尤为重要。

4、一个流程的生命周期

我们在业务开发的时候,通常会面临着一个业务的流程开发,流程的生命周期必然有开始与结束。有if条件,就必须要考虑到else条件如何执行。比如简单的登录流程,输入用户名和密码,校验正确就跳转到下一个页面,错误就弹出提示框。但往往登录流程不会这么简单,会有二维码登录、手机短信验证登录、图形验证、账号授权、账号服务有效期、登录提示问题等等环节,里面有些是单条件控制的,有些是组合条件控制的,这里画出来的流程图就会比较复杂。所以一个流程里面,要么完美的走到一个结束点,要么形成一个闭环(不是死循环),不要遗漏一些分支流程没有妥善处理,不然到用户那里就有可能产生bug。这里建议复杂流程都要画好流程图,写代码的时候按照流程图的开发会比较好处理。流程图建议使用 ProcessOn 工具,一个在线作图工具,满足基本的作图需求。

5、一个线程的生命周期

在new Thread().start()之后,通常我们就不考虑控制这个线程的运行状况了。在Android开发里面,子线程的执行,一般用于耗时操作,避免主线程发生阻塞。但一个子线程的生命周期,也会有开始与结束,这里先不说挂起、阻塞、等待等状态,但最基本的线程生命周期结束状态,结束点是否会引起内存泄漏或者空指针之类。在查询数据库、文件操作的子线程,弱网场景下的网络线程,如果没考虑到线程结束时的妥善处理,很容易引起一些异常。

这里的线程,可以理解为一个任务,相应的Runable、TimerTask、Handler、AsyncTask等用于执行任务的类,也同样需要考虑他们的生命周期内,代码是否处理得当,从而不会引起一些异常。

6、结合Android系统组件的生命周期

我们在开发Android应用的时候,以上所说到的流程,都应该控制在系统组件的生命周期之内,也就是在系统组件开始的时候,再做相关的内存申请、初始化操作,在系统组件结束的时候,要做好相应的资源回收,内存释放。这里包括Activity、Fragment、Service、Application等。

总结

还用很多类似的,在编写代码的时候,都应该多考虑自己所写的代码的生命周期是如何开始的,如何执行的,如何结束的,在哪个环节需要怎样的处理,以便不会出现异常,以增强代码的健壮性。而不是写了开始,自我感觉代码执行后的如你所愿,却忽略了发生异常场景如何处理。这也是在软件开发过程中对自己的一些忠告总结吧。

你可能感兴趣的:(通过生命周期来思考软件的健壮性)