经过本人的面试经验,以及接触的android项目,总结了一下android的一些类库的优缺点:
一,线程方面
1.AsyncTask 首先是线程优化以及缺陷方面,针对目前大多数类库来说,都有好的设计方面和缺陷的方面,比如内部自带的AsyncTask,这个类优点很多,使用方便,加 快快速开发,但是每次都需要new 一下然后把对应的参数放在里面,感觉这个过程不是十分稳妥,性能有待加强,主要是内部的一个多线程单任务队列的这么一个机制,其实很恶心,只要大多数人仔 细用过这个类,都能够发觉他其实是顺序执行你的任务 的,只要稍不注意 感觉就像是单线程执行了,我对这个类的设计方面有待加强,一直不明白为何要这么去设计,优点在哪,当然他也有他好的地方,就是能够让我们自定义一个线_线 程池去执行任务,可以完全抛弃他得单任务的思想。(据说是google工程师说得一段话:多线程是个复杂的事情,我们简化来避免开发者犯错,如果你们要多 线程,调用新方法就行了)
2.Vollery 这个类是google 2013年提倡一个类,他适用于网络通信频繁,大量网络请求的场景,我大概的看了一下源码,里面实现机制却是不错,提供了缓存的实现,其次还提供了任务取 消机制,能够在activity结束的时候取消一些未完成的请求。但是也有不好的地方,如果只是一两个请求,就没有必要追求这个类,因为他初始化的时候就 会去开启好几个线程,有点类似于master-woker的线程模型。其次在缓存管理方面不是很灵活,在需要仔细管理缓存方面的时候,不能够去细分缓存的 管理,最后在单个数据比较大得时候,最好别用这个,比如下载文件的时候。其实为啥想想就知道,他会缓存数据,如果把那么大得数据也缓存了,其实也挺恶心 的。
3.有关线程的一些内部管理,虽然可以用多线程来改善android的运行效率和速度,但同时也会带来一些负面的效应,他会增加耗电量,同时如果不限制线 程的开销,可能会导致anr,毕竟线程是获取时间片去执行的,但是如果大量的线程都耗费时间的话,这样也会引起一定的卡顿。最好的办法就是统一线程管理, 不用随便的使用new Thread(){}.start(),这种方式去开启线程,呆了两个创业公司的感觉,这种代码随处可见。
二,ui方面
1. 其实在ui适配这个方面,有很大的争议,很多人的做法都是不同文件夹下放入不同的图片,但是这样也会有一个不好的地方,他会导致整个应用变得很大,最近也 再关注一些牛人的博客,stormzhang这个说得我感觉是挺有道理的,其实只需要适配一下大的手机图片,保证图片尽量不被拉伸,其实缩小的话就没有那 么大的必要了,最近跟一些群里面的朋友交流,其实也可以用矢量图来解决这个问题,因为矢量图不会失真,然后判断哪些会被拉锁的图片,用.9来处理 其实_也能很好的解决适配的问题。
2. 然后有关于布局方面的优化,比如说你在用一个include这个标签的时候,被导入进来的布局很多时候可以用merge这个标签,能够动态的替代 frameLayout,减少一层标签,有关RelativeLayout和LinearLayout这两个类一直是相互替换的,很多时候如果你的布局只 有一层的时候那么就用LinearLayout,因为他效率高,比较布局的形式相对简单很多,如果布局层次很复杂,那么最好使用 RelativeLayout这个去进行布局。可以有效的改善效率。很多时候都会采用到一个VISIBLE的控件在布局上面,这些控件其实在不用的时候可 以用viewStub这个标签去改善一下,等待使用的时候再去加载进来.
三,数据库方面
android 的数据库并发性能不好,因为本来就不是为了并发去设计的,所以最好使用单例模式,否则多个线程操作数据库会抛出异常的,其次是在批量插入时的优 化,sqlite默认会加上事务,所以批量插入的时候千万要先开启事务在事务中进行批量操作,否则批量操作就会打开多个事务,导致性能下降。
四,缓存方面
基本上很通用的,因为缓存基本上都养成了习惯,首先是listview 的view用ViewHolder进行缓存,其次是对图片的缓存,第三是对网络的缓存,第四是网络流的时候采用合理的利用缓存机制能够更快的加快下载速度和通信速度。
五,延迟方面
这 个常常使用在一些界面比较复杂和业务也很复杂的场景,比如说其实很多东西可以在调用onstart的时候去加载,因为onstart这个方法调用的时候用 户已经可以看见界面了。可以很好的防止界面过于复杂导致的黑屏时间过长,但是这个只是一个提高用户体验的方法,要治根还是得优化界面。然后把数据的加载都 异步化。最后还有一个handler使用的小策略,当数据比较多得时候可以适当的延迟一下handler的发送,比如说可以调用 handler.sendEmptyMessageDelayed,设置一下延迟的时间。
六,网络方面
网 络优化一直是一个很常问的话题,但针对于客户端来说基本上做优化的地方不是太多,首先保证打开gzip压缩,二 ,给网络请求加上timeout过期时间,三,数据格式的定义,跟android最好的通信方式就是json,因为数据量比较小,尽量能够合并请求,这是 一个能够提高不少效率的做法,四,减少重定向的次数
七,代码优化
这个无论是任何语言都通用的优化方式,也是最根本的方式,这个话范围太大了,只能用调优工具去跟踪。然后去改善代码质量,没有绝对的调优方式。