为什么你的android代码这么混乱

Android上绝大多数的代码,都是由事件触发的,或者说,几乎所有代码都是写在某个回调上的,比如onCreate, onPause, onClick,onBind等等,而这些回调函数,全都是一个个的函数,也就是说,是一个一个小的过程。

单个事件内完成的功能

对于一些简单的情况,在某一个回调内部就能完成的事件,大致上都是在回调中创建一个A类的对象,然后调用A类的某个方法,这个方法里面又用到了B类和C类的对象,经过了一系列翻云覆雨的计算,我们最终得到了一些数据,用TextView显示了出来,比如点击一个按钮弹出一个Toast显示当前软件的版本号这样的功能,只需要一个onClick就可以完成。所以我们可以粗暴的理解为,所有面向对象,都是基于过程的。因为只有一系列对象,按照某种特定的顺序组织起来,调用里面特定的方法,才能得出一个有意义的功能。这也解释了为什么很多SDK,就给你个方法,告诉你,你什么都不用管,在Application的onCreate里面调一下这个方法就好了。


任何一个功能都可以用一个方法来完成

多个事件配合完成的功能

再比如一些稍微复杂一点的功能,需要多个事件配合,比如计算器,当用户按下第一个数字的时候,触发了onClick事件,你要把这个数字保存为activity的某个字段,接着,用户按下了加号和第二个数字,你都要这样保存起来,以便于在最终用户按下等号的时候,你能把以前的一系列输入获取到,以计算出一个结果。也就是说,当一个功能需要多个事件配合完成的时候,我们做的事情就是把各个事件的最终结果从局部作用域提升为类的字段,即提升可见性。当可见性不那么好提升的时候,垃圾代码就出现了。比如这样的代码:


五行缺Context

Context是非常常用的一个对象,无论是发广播,还是启动activity,启动Service,获取SharedPreferences,获取资源等等,许多地方都需要用到context,加上Application对象一直存在,于是就想出了这么个办法。

我并不反对通过提升可见性来实现多个事件之间的配合,比如计算器的例子,提升可见性就是一个简洁优雅的解决方案。但是很多时候为了提升某些字段的可见性,将字段设置为静态字段是没有必要的,而且有可能造成内存泄漏。

什么样的代码简洁清晰

我们之所以代码写得那么难受,很多时候是因为给的接口不够“多”,试想一下,如果SD卡的文件被改动有回调,手机位置发生变化有回调,网络状态一变化就有回调,这会让很多功能实现起来变得非常简单。


封装必要的回调函数

什么事件需要写回调?通常是那些破坏代码简洁的逻辑,比如耗时的操作,像网络请求,大量计算,获取地理位置等,或者一直在被监听的事件,比如推送到本地的消息,文件被篡改、网络状态等。让那些简单不耗时的操作,比如读取文件,弹出Toast或者设置TextView分门别类的放在这些回调里面,让人一目了然。

这些是无法用MVP,MVVM等架构解决的,原因很简单,因为无论怎么分层,这些回调都是需要的,分层只是把这些回调放在不同的文件里面而已。软件分层一方面是为了容易移植,另一方面是为了分离纯Java的代码,方便做单元测试。

回调只是让代码简洁的方式之一,过多的回调容易让人眼花缭乱,分不清哪个回调是被谁触发的,所以实际使用过程当中要注意权衡。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值