前言

今天看到一个不错的缓存池,分享给大家。

代码地址:androidx.core.util.Pools
Pool

    /*** Interface for managing a pool of objects.** @param <T> The pooled type.*/public interface Pool<T> {/*** @return An instance from the pool if such, null otherwise.*/@NullableT acquire();/*** Release an instance to the pool.** @param instance The instance to release.* @return Whether the instance was put in the pool.** @throws IllegalStateException If the instance is already in the pool.*/boolean release(@NonNull T instance);}

这个是一个接口,只有两个方法,1.请求一个缓存对象,2.把不需要的对象放到缓存池里面。
SimplePool

   /*** Simple (non-synchronized) pool of objects.** @param <T> The pooled type.*/public static class SimplePool<T> implements Pool<T> {private final Object[] mPool;private int mPoolSize;/*** Creates a new instance.** @param maxPoolSize The max pool size.** @throws IllegalArgumentException If the max pool size is less than zero.*/public SimplePool(int maxPoolSize) {if (maxPoolSize <= 0) {throw new IllegalArgumentException("The max pool size must be > 0");}mPool = new Object[maxPoolSize];}@Override@SuppressWarnings("unchecked")public T acquire() {if (mPoolSize > 0) {final int lastPooledIndex = mPoolSize - 1;T instance = (T) mPool[lastPooledIndex];mPool[lastPooledIndex] = null;mPoolSize--;return instance;}return null;}@Overridepublic boolean release(@NonNull T instance) {if (isInPool(instance)) {throw new IllegalStateException("Already in the pool!");}if (mPoolSize < mPool.length) {mPool[mPoolSize] = instance;mPoolSize++;return true;}return false;}private boolean isInPool(@NonNull T instance) {for (int i = 0; i < mPoolSize; i++) {if (mPool[i] == instance) {return true;}}return false;}}

有一个简单的实现类,实现方法很简单,把释放的对象放到了数组里面。
SynchronizedPool

    /*** Synchronized) pool of objects.** @param <T> The pooled type.*/public static class SynchronizedPool<T> extends SimplePool<T> {private final Object mLock = new Object();/*** Creates a new instance.** @param maxPoolSize The max pool size.** @throws IllegalArgumentException If the max pool size is less than zero.*/public SynchronizedPool(int maxPoolSize) {super(maxPoolSize);}@Overridepublic T acquire() {synchronized (mLock) {return super.acquire();}}@Overridepublic boolean release(@NonNull T element) {synchronized (mLock) {return super.release(element);}}}

继承自SimplePool,唯一的区别是加了一把锁。

谁在用?
RecycleView 在使用这个工具类。
androidx.recyclerview.widget.AdapterHelper#mUpdateOpPool

Android 缓存池工具类相关推荐

  1. android自定义线程池工具类,妈妈再也不用担心你不会使用线程池了(ThreadUtils)...

    为什么要用线程池 使用线程池管理线程有如下优点:降低资源消耗:通过重复利用已创建的线程降低线程创建和销毁造成的消耗. 提高响应速度:当任务到达时,任务可以不需要等到线程创建就能立即执行. 提高线程的可 ...

  2. Android常用的工具类

    2019独角兽企业重金招聘Python工程师标准>>> 最新最准确内容建议直接访问原文:Android常用的工具类 主要介绍总结的Android开发中常用的工具类,大部分同样适用于J ...

  3. 一个bitmap缓存的工具类

    项目中用到了很多图片,所以写了个bitmap缓存的工具类 package cn.com.shine.pdi.hptv.util;import android.graphics.Bitmap; impo ...

  4. Android开发常用工具类集合

    转载自:https://blog.csdn.net/xiaoyi_tdcq/article/details/52902844 Android开发常用工具类集合 android开发中为了避免重复造轮子, ...

  5. android 快速开发工具类,android面试知识点

    项目地址:570622566/FastAndrUtils  简介:android 快速开发工具类 更多:作者   提 Bug   官网 标签: Fastandrutils 是一套整理修改整合的 and ...

  6. Android使用的工具类

    Android实用的工具类 https://github.com/AbrahamCaiJin/CommonUtilLibrary#获取app应用版本信息--appapplicationmgr

  7. 退出整个Android程序的工具类

    在实际的Android开发过程中常常有退出整个Android程序的需求,下面给大家介绍一下如何编写一个退出整个Android程序的工具类 package com.superGao.exitApp; i ...

  8. Android软键盘工具类

    Android软键盘工具类 public class SoftKeyboardUtils {/*** 隐藏或显示软键盘* 如果现在是显示调用后则隐藏 反之则显示*/public static void ...

  9. android 单位转换工具,Android单位转换工具类

    Android单位转换工具类 Android单位转换工具类主要由以下4部分构成 1.这个类不能被初始化 2.dip转px接口 3.sp转px接口 4.px转dip接口 代码如下: import and ...

最新文章

  1. 20180521 数组转换
  2. 关于“如何破坏单例“我说了好几种方式,面试官却说:我其实随便问问,没想到你真会
  3. html5重新加载页面,使用AngularJSHTML 5模式重新加载页面会产生错误的GET请求
  4. 数字时代职业生涯规划
  5. django html文本编辑器,django xadmin 集成DjangoUeditor富文本编辑器
  6. 用python画竹子_?【蟒蚺迷】BAMBOO BALLPYTHON!
  7. NLP(新闻文本分类)——数据读取与数据分析
  8. 沉船会有什么_世界六大沉船,最后一艘有40吨财宝!8吨黄金!你眼红了吗?
  9. 计算机专业学生前端该怎么自学?
  10. TIPS:My导入数据中文乱码解决方案
  11. 修改浏览器 User-Agent
  12. .NET(C#、VB)APP开发——Smobiler平台控件介绍:AliPay组件
  13. C语言----最长公共子串(动态规划)
  14. 【面试题】总结最高频软件测试|思维发散|计算机基础|Linux|测试用例|接口测试|等技术面试题
  15. STM32之俄罗斯方块
  16. 从 radix tree 到 xarray
  17. 电影评论分类:二分类问题(IMDB数据集)
  18. vue中使用市区(地区)联动 复制三步完成
  19. 一个极其简单的用golang net写的tcpip echoserver
  20. python在园林中的应用_浅析亭在园林中的应用

热门文章

  1. mysql 第一天_MySQL第一天
  2. cdh 安装_CDH 中为spark 安装 python3
  3. win7如何取消计算机管理员权限,win7如何删除需要管理员权限的文件夹
  4. pytest测试实战 电子书_pytest实战APL测试框架
  5. Android与iOS:谁更适合HTML 5?
  6. cheked复选框返回值的时候选中
  7. # 可视化工具资源汇总
  8. 管理数据,应用程序和主机安全-B
  9. 《Linux From Scratch》第三部分:构建LFS系统 第八章:让LFS系统可引导 - 8.2. 创建 /etc/fstab 文件...
  10. java中如何取到一个对象的所有属性值,并且在创建一个相同的对象