1.减少内存占用
使用轻量级数据结构
少使用枚举.比static占内存多几倍
减少bitmap内存占用:预加载宽高(injustDecodeBounds=true),缩小size(缩小2的inSampleSize次幂),改解码方式(一般不用的).ARGB_8888一个像素32位,改ARGB_4444,RGB啥的,但图片颜色,清晰度什么的会受影响.
2.内存对象复用
bitmap:LRUCache
listView:view
RecycleView:ViewHolder
避免在onDraw()等频发执行的方法内创建对象
stringbuilder/stringbuffer<br/>
3.减少内存泄漏
优先用application context代替activity context
handler:在onDestroy()之前remove掉队列中的消息和runnable对象,或者static加弱引用,继承Handler
listener监听的注销
cursor,connection,数据库,IO的关闭
AsyncTask多次new.Bitmap太多没有及时回收
对象的泄漏,new出一个对象,没有调用.
AIDL(Android Interface definition language)Android内部进程通信的接口定义语言.
通过编写aidl文件来定义进程间通信接口,编译后会自动生成响应的Java文件.
服务器将接口的具体实现写在stub中,用IBinder对象传递给客户端.
客户端bindserver,用asInterface的形式将IBinder还原成接口,在调用其接口中的方法来实现通信.
##volatile关键字
Volatile是轻量级的synchronize,在处理器开发中保证了共享变量的”可见性”.可见性的意思是当一个线程修改一个共享变量时,另一个线程能读到这个修改的值,在某些情况下比synchronize的开销更小.如果
一个字段被声明volatile,java线程内存模型确保所有线程看到这个变量的值是一致的.
在恰当的使用volatile比synchronize的使用和执行的成本更低,因为不会引起线程的上下文的切换和调度.
volatile的优化,是追加64字节能够提高并发编程的效率
##两个Activity之间如何传递参数
Intent的Bundle携带参数,即intent.putExtra()
传递自定义的对象:—->
增加序列化Serializable和Parcelable
Serializable和Parcelable的区别:—->
Serializable:是反射,序列化和反序列化过程需要大量的I/O操作
Parcelable:自己实现封送和解封,不需要反射,数据存放在Native中,效率快很多.底层实现是Parcel容器对象,Parcel类是一种最快的序列化和反序列化机制
两个Activity传递对象需要注意:—->
注意对象的大小,Intent的Bundle是使用Binder机制进行数据传递,一个进程默认有16个binder线程(大约一个线程占用128K)The Binder transaction failed because it was too large.”这类TransactionTooLargeException异常
##res资源问题
图片放错目录会产生什么问题—->
高密度(density)的系统去使用低密度目录下的图片资源,会将图片长宽自动放大以去适应高密度的精度,图片占用的内存会更大.在图片资源有限的情况下将图片放在高密度文件夹下,节省图片的内存开支.
mipmap—->
官方建议如下图片资源
Launcher icons.
Action bar and tab icons.
Notification icons
##Bitmap
高效的加载Bitmap,采用BitmapFactory.Options来加载图片,
压缩 缩放图片主要是inSampleSize参数,采样率,采样率为1是原始大小,采样率>1,比如是2,宽高则为原图大小的1/2,像素为原图的1/4,内存大小也为原图的1/4,采样率<1,就相当于1,无缩放效果 injustdecodebounds设为true,解析原始宽高,不会真正加载="" 加载大图----="">
BitmapRegionDecoder.newInstance
在onDraw()方法中
bitmapRegionDecoder.decodeRegion(rect,options)指定绘制区域
用canvas绘制出来1,就相当于1,无缩放效果>
##优化列表卡顿
异步
在列表滑动的时候不加载,静止在加载(OnScrollListener的onScrollStateChaged判断滑动状态)
开启硬件加速(android:hardwareAccelerated = “true”)
##Rxjava操作符
变换操作符:
map最简单的变化操作符
flatMap将上游发送过来的数据变换为多个数据然后合并成一个事件发送到下游,发送到下游的数据是无序
ConcatMap是有序的
过滤操作符:
Filter过滤一部分不符合要求的事件,如果全部接受容易造成OOM,最常见的是过滤一些null
Sample每隔一段时间对上游数据进行取样发送到下游,这样会导致丢失大量事件,只有特定的场合,比如对一组数中进行抽
take/takeList
take是将上游前N项发送到下游
takeList是将最后N项发送到下游
distinct可以去除重复对象
组合操作符:
zip Observable.zip(observable,observable1,observable2,new Function<Integer,String.String>){}
##Retrofit操作符
Path相对路径
Query和QueryMap
Query技术Uri中?后面的key-value
QueryMap就是有很多的Query
Body传递的是对象,将对象转换成json数据可以通过converter实现
POST
@FormURLEncoded
Field和FieldMap
Field表单提交,field声明表单的项
多个就用FieldMap
Part和PartMap
@Mutipart
上传文件,part和filed的区别就是part携带的参数类型更加丰富,包括数据流
多个文件上传partMap