Android应用开发之Android性能优化教程之数据优化详解
凌雪 2018-09-21 来源 :网络 阅读 630 评论 0

摘要:本文将带你了解Android应用开发之Android性能优化教程之数据优化详解,希望本文对大家学Android有所帮助。

本文将带你了解Android应用开发之Android性能优化教程之数据优化详解,希望本文对大家学Android有所帮助。


Android性能优化教程之数据优化详解
    今天,继续Android性能优化一 编码细节优化。
    编码细节,对于程序的运行效率也是有很多的影响的。今天这篇主题由于技术能力有限,所以也不敢在深层去和大家分享。我将这篇主题分为以下几个小节:
    (1)缓存
    (2)数据
    (3)延迟加载和优先加载
    1> 缓存
    在Android中缓存可以用在很多的地方:对象、IO、网络、DB等等。。对象缓存能减少内存分配,IO缓存能对磁盘的读写访问,网络缓存能减少对网络的访问,DB缓存能减少对数据库的操作。
    缓存针对的场景在Android开发中也很明显:
    (1)图片缓存
    Android中提供了LruCache缓存机制。我们可以使用LruCache来进行图片的缓存。对图片的缓存处理步骤一般是:
    加载图片 -> 判断缓存中是否存在 ->存在,直接取出设置到ImageView ->不存在,则请求网络下载图片 ->   图片下载成功,将图片缓存,设置到ImageView
      在Android中有很多优秀的第三方开源库,所以我们也不必去重复造轮子。例如:Fresco(FaceBook的产品)、Picasso、Glide、UIL。
    (2)不经常改变的数据
    对于不需要经常改变的数据,例如App中的一些产品分类。我们就可以将其缓存起来。不用每次都去请求网络来加载数据。这个比较容易理解,不多说了。
    (3)ListView的缓存
    ListView Item数据的缓存,相信大家都比较清楚。就是利用Adapter类的getView方法中convertView复用原理,创建ViewHolder实现复用。Material   Design 中也提供了RecyclerView来替代ListView。它会强制你在Adapter中使用ViewHolder来复用View。
    (4)消息缓存
    此处消息是指Handler中发送的Message。系统为我们提供了obtainMessage()来复用一个Message。我们来看下源码:
   /** * Return a new Message   instance from the global pool. Allows us to * avoid   allocating new objects in many cases.   */public static Message obtain() { synchronized   (sPoolSync) {  if (sPool   != null) {Message m = sPool;sPool   = m.next;m.next = null;m.flags = 0; // clear in-use   flagsPoolSize--;return m;  } } return   new Message();}
    上述代码中,sPool就是被缓存的一个Message实例,首先判断如果不为null,直接拿来复用,否则创建新的Message实例。
    (5)IO缓存
    其实Java中就为我们提供了一些具有缓存策略的IO流:
    BufferedReader、BufferedWriter。使用该类IO流来代替 InputStream、Reader   和OutputStream、Writer等等。
    2> 数据
    对于数据存储的优化可以从数据类型和结构来划分。
      (1)使用StringBuilder或StringBuffer来拼接字符串,减少对象的临时分配。StringBuilder和StringBuffer的区别其实就一点:在并发操作下,StringBuffer是线程安全的。有利也有弊,线程安全的同时也导致了执行的速度下降。所以,如果不是在多线程操作的情况下,就使用StringBuilder。StringBuilder和StringBuffer的构造函数都允许你传入一个数量级来初始化它的空间大小。从而可以分配一定的空间大小,节省内存资源。
      (2)使用WeakReference。弱引用带来的好处想必大家都是清楚的。尤其是在Android这种内存空间有限的设备中,对于内存的分配和释放是很重要的。WeakReference使用很典型的一个场景就是Handler。大家都清楚,在Activity或Fragment中使用Handler一般都是作为内部类来实现的。这样就会引发一个问题。如果handler中的某个任务执行较长的时间,那么在Activity或者Fragment需要被释放的时候(onDestory),由于handler所关联的Message还没有执行完成。这时handler就不能被释放,由于handler与Activity或Fragment所关联,那么就会导致Activity或Fragment不能被有效释放,最终导致其资源不能被释放,结果可想而知:oom。所以,解决该问题的办法就是使用WeakReference或者将Handler定义成static。下面来看使用WeakReference的方式:
    ?1234567891011121314private final MyHandler myHandler = new   MyHandler(this);private static class MyHandler extends Handler {private final   WeakReferencem;public MyHandler(HomeFragment   homeFragment){m = new WeakReference(homeFragment);}@Overridepublic   void handleMessage(Message msg) {HomeFragment homeFragment =   m.get();if(homeFragment != null)   {homeFragment.vpBanner.setCurrentItem(msg.arg1);;}}}
    代码很简单,就是将Fragment放在WeakReference中。在handleMessage中直接取出来操作其中的View.
    数据结构方面就比较多了,例如ArrayList和LinkedList、LinkedHashMap和HashSet、WeakHashMap。
    (1)ArrayList对于数据的查询速度比较快,LinkedList对于数据的插入和删除速度要比ArrayList快。
      (2)LinkedHashMap可以记住数据存入的次序,HashSet不允许有重复的元素存在。WeakHashMap中的数据可以在适合的时候被系统GC自动回收,适合在内存吃紧的场景下。
    (3)Collections工具类中也提供了很多的适合多线程下操作的集合,并提高了性能,例如:
      (4)Android中系统也提供了性能更优的数据类型,如:SparseArray,SparseBooleanArray,SparseIntArray,Pair。Sparse的key为Int类型。采用二分查找及简单数组存储。并且不需要泛型转换的开销,相对于Map来说性能更优。
    3>延迟加载
    在Android中延迟加载的用途也比较广泛,例如ViewPager中Fragment数据的延迟加载。因为ViewPager默认是初始化两内容的。所以我们需要来处理进行延迟加载。
    同样,不在Activity或Fragment对时间敏感的函数中进行耗时操作。避免出现ANR的异常发生。
      Java中提供了ScheduledxecutorService作为延迟加载,其实Timer定时器的延时是有bug存在的。所以不推荐使用Timer。鸿洋博客有讲该Timer的缺陷:Timer   缺陷
    Android中可以使用handler的一些方法来延迟操作:
    (1)postDelayed
    (2)postAtTime
    (3)sendMessageDelayed
    以及View的postDelayed,AlarmManager定时等。    

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注移动开发之Android频道!

本文由 @凌雪 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程