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 flag
  sPoolSize--;
  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的方式:

private final MyHandler myHandler = new MyHandler(this);
private static class MyHandler extends Handler {
 private final WeakReference<HomeFragment> m;
 public MyHandler(HomeFragment homeFragment){
 m = new WeakReference<HomeFragment>(homeFragment);
 }
 @Override
 public 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定时等。

(0)

相关推荐

  • Android编程开发之性能优化技巧总结

    本文详细总结了Android编程开发之性能优化技巧.分享给大家供大家参考,具体如下: 1.http用gzip压缩,设置连接超时时间和响应超时时间 http请求按照业务需求,分为是否可以缓存和不可缓存,那么在无网络的环境中,仍然通过缓存的httpresponse浏览部分数据,实现离线阅读. 2.listview 性能优化 1).复用convertView 在getItemView中,判断convertView是否为空,如果不为空,可复用.如果couvertview中的view需要添加listern

  • 浅析安卓(Android)的性能优化

    Android性能的优化主要分为两点 1.布局优化 2.内存优化 布局优化 首先来看一下布局优化,系统在渲染UI的时候会消耗大量的资源,所以,对布局的优化就显得尤为重要 避免Overdraw 也就是避免过度的绘制,过度的绘制会浪费更多的资源,举个例子,Android系统会默认绘制Activity的背景,这时候我们再设置一个背景,这样默认的背景就属于过度绘制了,在『开发者工具』中有一个『调试GPU过度绘制』的选项,我们打开就可以通过颜色来判断过度绘制的次数 如图: 所以说我们尽可能的增大蓝色区域,

  • Android中SparseArray性能优化的使用方法

    之前一篇文章研究完横向二级菜单,发现其中使用了SparseArray去替换HashMap的使用.于是乎自己查了一些相关资料,自己同时对性能进行了一些测试.首先先说一下SparseArray的原理. SparseArray(稀疏数组).他是Android内部特有的api,标准的jdk是没有这个类的.在Android内部用来替代HashMap<Integer,E>这种形式,使用SparseArray更加节省内存空间的使用,SparseArray也是以key和value对数据进行保存的.使用的时候只

  • Android高级开发之性能优化典范

    本章介绍android高级开发中,对于性能方面的处理.主要包括电量,视图,内存三个性能方面的知识点. 1.视图性能 (1)Overdraw简介 Overdraw就是过度绘制,是指在一帧的时间内(16.67ms)像素被绘制了多次,理论上一个像素每次只绘制一次是最优的,但是由于重叠的布 局导致一些像素会被多次绘制,而每次绘制都会对应到CPU的一组绘图命令和GPU的一些操作,当这个操作耗时超过16.67ms时,就会出现掉帧现象,表现为应用卡顿,所以对重叠不可见元素的重复绘制会产生额外的开销,需要尽量减

  • Android性能优化方法

    GPU过度绘制 •打开开发者选型,"调试GPU过度绘制",蓝.绿.粉红.红,过度绘制依次加深  •粉红色尽量优化,界面尽量保持蓝绿颜色  •红色肯定是有问题的,不能忍受 使用HierarchyView分析布局层级 •删除多个全屏背景:应用中不可见的背景,将其删除掉  •优化ImageView:对于先绘制了一个背景,然后在其上绘制了图片的,9-patch格式的背景图中间拉伸部分设置为透明的,Android 2D渲染引擎会优化9-patch图中的透明像素.这个简单的修改可以消除头像上的过度

  • 浅谈Android开发中ListView控件性能的一些优化方法

    ListView优化一直是一个老生常谈的问题,不管是面试还是平常的开发中,ListView永远不会被忽略掉,那么这篇文章我们来看看如何最大化的优化ListView的性能. 1.在adapter中的getView方法中尽量少使用逻辑 2.尽最大可能避免GC 3.滑动的时候不加载图片 4.将ListView的scrollingCache和animateCache设置为false 5.item的布局层级越少越好 6.使用ViewHolder 下面就具体来看一些 1.在adapter中的getView方

  • Android布局性能优化之按需加载View

    有时应用程序中会有一些很少用到的复杂布局.在需要它们的时候再加载可以降低内存的消耗,同时也可以加快界面的渲染速度. 定义ViewStub ViewStub是一个轻量级的View,它没有高宽,也不会绘制任何东西.所以它的加载与卸载的成本很低.每个ViewStub都可以使用android:layout属性指定要加载的布局. 下面这个ViewStub用于一个半透明的ProgressBar的加载.它只有在新工作开始时才会显示. <ViewStub android:id="@+id/stub_imp

  • Android开发性能优化总结

    一. 加载 预加载:1.反射注解框架Reflect信息,在Application内多线程预加载至缓存.2.资源预加载 懒加载:1.Fragment懒加载2.资源懒加载 二. 缓存 1. Http缓存,淘汰时间 2. 图片缓存,bitmap压缩,Lru淘汰,持久化二级缓存 3. 反射注解框架Reflect信息缓存,防止多次反射操作 三. 异步防止Anr 1. 避免在UI线程做太多耗时操作,IntentReceiver > 10s Anr 2. 并发操作多用读写锁,少用synchronized,An

  • Android编程获取GPS数据的方法详解

    本文实例讲述了Android编程获取GPS数据的方法.分享给大家供大家参考,具体如下: GPS是Android系统中重要的组成部分,通过它可以衍生出众多的与位置相关的应用. Android的GPS有一个专门的管理类,称为LocationManager,所有的GPS定位服务都由其对象产生并进行控制. 首先需要明确的是,LocationManager类的对象获取并不是直接创建的,而是由系统提供的,具体来说,通过如下方法,为一个LocationManager对象建立一个对象引用: 复制代码 代码如下:

  • Android实现读写JSON数据的方法

    本文实例讲述了Android实现读写JSON数据的方法.分享给大家供大家参考.具体如下: 1. 解析JSON: package de.vogella.android.twitter.json; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import org.apache.http.HttpEntit

  • Android编程获取图片数据的方法详解

    本文实例讲述了Android编程获取图片数据的方法.分享给大家供大家参考,具体如下: 网络的访问在我们日常生活中太重要了,如果没有网络我们的生活将会是什么样子呢?Android手机和浏览器也是一样的,也可以通过网络通讯获取数据,如调用webservice,EJB等.下面就通过一个小例子从网络获取一幅图片并显示在手机上,开发中将会使用到一个新的组件ImageView. 1. 写一个用来处理字节流的工具类 package org.lxh.util; import java.io.ByteArrayO

  • Android开发获取传感器数据的方法示例【加速度传感器,磁场传感器,光线传感器,方向传感器】

    本文实例讲述了Android开发获取传感器数据的方法.分享给大家供大家参考,具体如下: package mobile.android.sensor; import java.util.List; import android.app.Activity; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import an

  • Android性能优化以及数据优化方法

    Android性能优化-布局优化 今天,继续Android性能优化 一 编码细节优化. 编码细节,对于程序的运行效率也是有很多的影响的.今天这篇主题由于技术能力有限,所以也不敢在深层去和大家分享.我将这篇主题分为以下几个小节: (1)缓存 (2)数据 (3)延迟加载和优先加载 1> 缓存 在Android中缓存可以用在很多的地方:对象.IO.网络.DB等等..对象缓存能减少内存分配,IO缓存能对磁盘的读写访问,网络缓存能减少对网络的访问,DB缓存能减少对数据库的操作. 缓存针对的场景在Andro

  • Android Activity之间的数据传递方法总结

    前言 在Activity间传递的数据一般比较简单,但是有时候实际开发中也会传一些比较复杂的数据,本节一起来学习更多Activity间数据的传递方法. 1.通过 Intent 传递 我们在进行 Activity 跳转时,是要有 Intent,此时 Intent 是可以携带数据的,我们可以利用它将数据传递给其它Activity.Intent 应该是系统提供的支持类型最广,功能最全面的传递方式了.基本数据类型.复杂数据类型(如数组.集合).自定义数据类型等等都能支持,而且使用起来也不复杂.下面将通过几

  • Android用文件存储数据的方法

    本文实例为大家分享了Android用文件存储数据的具体代码,供大家参考,具体内容如下 存储数据示例: private void saveFileData() { BufferedWriter writer = null; try { FileOutputStream out = openFileOutput("data", MODE_PRIVATE);//保存的文件名为"data" writer = new BufferedWriter(new OutputStre

  • Android 实现永久保存数据的方法详解

    背景:在Android中按照数据保存的方式,可以分为如下几种Content Provider (用的SQLite实现),SQLite,SharedPreferences(用的XML实现),文件,网络等方式. 今天在项目中,需要做一个永久保存的数据,保存到本地.于是测试了这几种保存方式.其中:SharedPreferences.SQLite.Content Provider 会在[设置]--[应用管理]--点击[清除数据]的时候,会删除文件.所以不安全.文件系统:如果SD卡坏了,或者拔掉的时候也会

  • Android使用Sqlite存储数据用法示例

    本文实例讲述了Android使用Sqlite存储数据的方法.分享给大家供大家参考,具体如下: 一般在开发程序中,经常使用数据的存储功能,如在使用Delphi开发程序时,存储程序的简单设置的INI文件,在C#开发中有时也需要存储简单的设置,个人一般存储在XML中,也在INI中存储过,但是不如XML使用方便,那么这些都是简单的数据存储功能,在Android中也支持这样的文件存储,但是现在这里主要说的还是使用SQLite存储数据,SQLite是一种跨平台的数据库,是单文件式的,如咱们平常见的最多的Ac

随机推荐