Android 对象池的简单实现
首先简单说一下为什么要使用对象池,使用对象池的主要原因是防止短时间内频繁大量的创建和销毁对象,也就是频繁GC,引起内存抖动,导致影响我们应用的性能。
package com.qumitech.common.pool
/**
* author : hnliu
* e-mail : 1017928908@qq.com
* create date : 2020/09/12
* description :管理对象池的接口
*/
interface Pool<T> {
// 返回一个对象实例,如果对象池里面有则从里面直接取一个,没有则创建一个对象
fun get(): T?
// 释放一个实例到对象池
fun recycle(instance: T): Boolean
// 清空对象池
fun clear()
}
简单对象池,实现了从池子里面取一个对象出来,往对象池里面添加对象,清除对象池等简单操作
package com.qumitech.common.pool
import android.os.Handler
import android.os.Looper.getMainLooper
import android.util.Log
import com.qumitech.common.xlog.XLogExt
/**
* author : hnliu
* e-mail : 1017928908@qq.com
* create date : 2020/09/12
* description : 简单的对象池
*/
open class SimplePool<T>(maxPoolSize: Int) : Pool<T> {
class PoolObj<T>(val obj: T, var startTime: Long?)
val mPool: Array<PoolObj<T>?>
var mPoolSize = 0
override fun get(): T? {
if (mPoolSize > 0) {
val lastPooledIndex = mPoolSize - 1
val instance = mPool[lastPooledIndex]?.obj
mPool[lastPooledIndex] = null
Log.i("SimplePool", "从对象池获取一个对象:${
instance}, 当前对象数量:${
mPoolSize}")
mPoolSize--
return instance
}
return null
}
override fun recycle(instance: T): Boolean {
check(!isInPool(instance)) {
"Already in the pool!" }
if (mPoolSize < mPool.size) {
mPool[mPoolSize] = PoolObj(instance, System.currentTimeMillis())
mPoolSize++
Log.i("SimplePool", "回收一个对象:${
instance}, 当前对象数量:${