| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 移动开发 -> Android 布局异步加载中的pools对象缓存池源码分析 -> 正文阅读 |
|
[移动开发]Android 布局异步加载中的pools对象缓存池源码分析 |
作者:recommend-item-box type_blog clearfix |
Pool接口的定义来让我们看看这个Pool的接口,接口很简单,就2个方法。 acquire()主要是从缓存池中获取一个对象,这里可能为空。为空的情况: 1,对象缓存池中没有缓存对象,这种情况是对象池中没有放进任何对象。2,对象池中对象被用完了。release() 主要是释放一个对象到对象缓存池中,如果这个对象已经存在缓存池中,会抛出异常,如果缓存对象池已满,则返回false,不做任何操作。 public interface Pool { /**从缓存池中返回一个对象,可能为空。
*/ @Nullable T acquire(); /**
*释放一个对象到对象缓存池中
*如果这个对象已经存在缓存池中,会抛出异常
*/ boolean release(@NonNull T instance); } SimplePool的源码具体的实现逻辑在SimplePool,但这里没有加锁,如需要加锁,使用SynchronizedPool即可。 缓存大小mPoolSize必须大于0,否则抛出异常。 调用acquire()时候,先判断mPoolSize是否大于0: 如果小于0,返回null。 如果大于0,证明对象池中还有可用对象,然后取一个使用,这个对象从数组中移出(后面release会把它再加回来,觉得这里设计好巧妙)。mPoolSize减一。返回缓存实例。 调用release(),会先调用isInPool()判断这个对象是否存在数组中,存在就抛出异常。因为acquire()时候已经把它移出了。主要防止一个对象重复保存到数组中,操作同一对象发生未知异常。 然后判断pool是否已满,如果没有存满,缓存一个对象,mPoolSize加一。如果存满,直接返回false。下面是SimplePool的源码。 public static class SimplePool implements Pool { //线程池对象数组 private final Object[] mPool; //线程池目前可用对象size,意思是还存在多少个对象在数组中。 private int mPoolSize; /**
*/ public SimplePool(int maxPoolSize) { if (maxPoolSize <= 0) { throw new IllegalArgumentException(“The max pool size must be > 0”); } mPool = new Object[maxPoolSize]; } public T acquire() { //判断 mPoolSize ,判断对象池是否已经用完了。用完了返回null if (mPoolSize > 0) { //取一个下标 final int lastPooledIndex = mPoolSize - 1; //取出一个对象 T instance = (T) mPool[lastPooledIndex]; //把这个对象从数组中移出(后面release会把它再加回来)觉得这里设计好巧妙。 mPool[lastPooledIndex] = null; //下标减1,意思是已经拿走一个去使用了。 mPoolSize–; //返回对象 return instance; } //对象池用完了,返回null,让上层自己去新建一个吧 return null; } @Override public boolean release(@NonNull T instance) { //主要防止一个对象重复保存到数组中,判断这个对象是否存在数组中,存在就抛出异常。 //因为acquire()时候已经把它移出了。 if (isInPool(instance)) { throw new IllegalStateException(“Already in the pool!”); } //如果没有存满,缓存一个对象。 if (mPoolSize < mPool.length) { //把上面从数组中移出对象,再次保存回来。(移出保存是同一个哦)毕竟不是一次性的。 mPool[mPoolSize] = instance; //池子大小加一 mPoolSize++; return true; } //存满了,返回false ,这个上层可以针对这个做对应逻辑。 return false; } private boolean isInPool(@NonNull T instance) { //查找这个对象是否存在数组中 for (int i = 0; i < mPoolSize; i++) { if (mPool[i] == instance) { return true; } } return false; } } 如果需要同步使用SynchronizedPool即可。 来让我们看看大致的流程图流程图,丑是丑了点,将就看看吧! 想要深入了解更多Android进阶知识与资料可以叫入粉丝交流群:872206502
|
|
移动开发 最新文章 |
Vue3装载axios和element-ui |
android adb cmd |
【xcode】Xcode常用快捷键与技巧 |
Android开发中的线程池使用 |
Java 和 Android 的 Base64 |
Android 测试文字编码格式 |
微信小程序支付 |
安卓权限记录 |
知乎之自动养号 |
【Android Jetpack】DataStore |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 5:27:44- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |