Android内存优化

  1. 不要使用比需求更占空间的基本数据类型
  2. SparseArray代替HashMap,节省内存开销
  3. 基本数据类型的成员,可以全写成static final,static会由编译器调用clinit方法进行初始化

static final不需要进行初始化工作,打包在dex文件中可以直接调用,并不会在类初始化申请内存

  1. 循环尽量用foreach,少用iterator, 自动装箱尽量少用
  2. 字符串的连接尽量少用加号(+),使用StringBuffer或者StringBuilder替代
  3. 尽量使用IntentService,而不是Service
  4. 非业务需要不要把activity的上下文做参数传递,可以传递application的上下文
  5. 和Activity有关联的对象写成static 如private static Button btn; private static Drawable drawable;
  6. handler.postDelayed(),如果开启的线程需要传入参数,用弱引接收可解决,handler记得清除removeCallbacksAndMessages(null)

枚举优化

public class SHAPE

public static final int

public static final int

public static final int

public static final int

//flag 为true,表示可以多选, 限定枚举值value的取值范围

@IntDefflagtrue,valueRECTANGLE,TRIANGLE,SQUARE,CIRCLE

@TargetElementType.PARAMETER,ElementType.METHOD,ElementType.FIELD

// RetentionPolicy.SOURCE表示资源加载阶段

@RetentionRetentionPolicy.SOURCE

public @interface Model

private @Model int RECTANGLE

public void setShape@Model int value

this.valuevalue

@Model

public int

this.value

调用

SHAPE new SHAPE

s.setShapeSHAPE.CIRCLESHAPE.RECTANGLE

System.out.printlns.getShape

对象池的使用

通过控制对象的调用次数来控制创建对象对内存的影响

package com.example.wuyang.lsn4code

android.util.SparseArray

public abstract class ObjectPoolT

//空闲沲,用户从这个里面拿对象

private SparseArrayT freePool

//正在使用沲,用户正在使用的对象放在这个沲记录

private SparseArrayT lentPool

//沲的最大值

private int maxCapacity

public ObjectPoolint initialCapacity, int maxCapacity

//初始化对象沲

initalizeinitialCapacity

this.maxCapacitymaxCapacity

private void initalizeint initialCapacity

new SparseArray

new SparseArray

forint iinitialCapacityi++

// 对象创建留给调用者完成

freePool.puti,create

/**

* 申请对象

* @return

*/

public T acquire throws Exception

T null

synchronized freePool

int freePool.size

forint ifreeSizei++

int freePool.keyAti

freePool.getkey

iftnull

this.lentPool.putkey,t

this.freePool.removekey

t

//如果没对象可取了

iftnull lentPool.size+freeSizemaxCapacity

//这里可以自己处理,超过大小

iflentPool.size+freeSizemaxCapacity

throw new Exception

create

lentPool.putlentPool.size+freeSize,t

t

/**

* 回收对象

* @return

*/

public void releaseT t

iftnull

int lentPool.indexOfValuet

//释放前可以把这个对象交给用户处理

restoret

this.freePool.putkey,t

this.lentPool.removekey

protected void restoreT t

protected abstract T create

public ObjectPoolint maxCapacity

thismaxCapacity/2,maxCapacity

package com.example.wuyang.lsn4code

public class MyObjectPool extends ObjectPool

public MyObjectPoolint initialCapacity, int maxCapacity

superinitialCapacity, maxCapacity

public MyObjectPoolint maxCapacity

supermaxCapacity

@Override

protected Object //LRU

new Object

调用:

MyObjectPool new MyObjectPool

Object null

Object null

Object null

Object null

Object null

try

o1 pool.acquire

o2 pool.acquire

o3 pool.acquire

o4 pool.acquire

o5 pool.acquire

Log.i,o1.hashCode+

Log.i,o2.hashCode+

Log.i,o3.hashCode+

Log.i,o4.hashCode+

Log.i,o5.hashCode+

catch Exception e

e.printStackTrace

Log.e, e.toString

调用结果

以上是 Android内存优化 的全部内容, 来源链接: www.h5w3.com/php/705615.html

回到顶部