下面我们具体分析下VacantCell的缓冲机制是如何实现的。
cellX、cellY、spanX、spanY几个成员是空白网格的纵横索引号和占据相应单元网格数,我们这里可以不用关心。
POOL_LIMIT定义了可以缓存的VacantCell的最大值,正如注释所说,最多可以分配多达523个VacantCell对象,但是对于4X4的屏幕网格定义来说,100个的缓冲数应该是足够的了。也就是说,这个100的数值是一个经验值,我们可以根据实际情况作灵活修改。
sLock是一个Java Object对象,主要是拿来作同步控制的,我们可以不用关心。
sAcquiredCount是一个非常重要的变量,其实际上就是一个计数器,实时的统计当前缓存了多少个VacantCell对象值。根据这个计数器和POOL_LIMIT可以控制缓存对象不超过POOL_LIMIT的上限。
sRoot和next是缓存VacantCell对象链式存储的两个关键引用,分别表示VacantCell对象链表的表头和特定VacantCell对象链接的下一对象的引用。
好了,下面介绍VacantCell缓存的两个关键静态方法acquire()和非静态方法release()。
当需要VacantCell新对象的时候,Launcher会调用静态内部类的VacantCell的静态方法acquire()以获取新的VacantCell对象。请注意,这里获取新对象不是直接new一个VacantCell对象,而是acquire的。我们看acquire方法的内部,当sRoot为null的时候,是直接new VacantCell并直接return的,因为这个时候实际上还没有缓存可用;当sRoot不为null,这意味着已经有缓存的VacantCell对象了,那么直接从链表中取出sRoot指向的对象,并将sRoot所在对象指向的next作为新的表头sRoot,同时把sAcquiredCount计数减1。这实际上是一种典型的从链表中删除表头的操作,相信熟悉数据结构的朋友对此都不会陌生。
如果说acquire()方法提供的是如何利用VacantCell链式缓存,那么release()方法解决的就是如何构建VacantCell链式缓存的问题。我们看到,只有sAcquiredCount < POOL_LIMIT的前提下才会将VacantCell对象加入链式缓存。将当前VacantCell对象加入链式存储也很简单,将当前VacantCell对象的next指向原来的表头,将静态sRoot应用指向当前对象,同时sAcquiredCount加1。也就是说,这个操作其实就是把当前VacantCell对象插入VacantCell链表的表头。
那么如何使用这个VacantCell对象缓存呢?第一,当需要新的VacantCell对象的时候,通过调用VacantCell的静态方法acquire()来获取对象,而不是直接new VacantCell对象;第二,当一个VacantCell对象已经过期,不再需要的时候,调用该对象的release()方法将这个不再需要的对象加入缓存。
需要指出的是,如果直接new VacantCell对象也不会有直接的问题,只不过这意味着没有采用VacantCell缓存机制;如果一个对象不需要时不显示调用release()方法也不会有直接的问题,这意味着这个对象不会加入进VacantCell缓存链表,当没有链表各节点对象的引用关联,这个对象最终将被Android的Dalvik虚拟机当做垃圾自动回收。
本文详细分析了Android Launcher模块VacantCell缓存的实现原理,当我们需要频繁构造、释放大量的相同类型的Java对象的时候,我们考虑采用类似的缓存机制,这在某些场合下能有效的解决频繁分配对象导致的内存不足的问题。
static final class VacantCell {
int cellX;
int cellY;
int spanX;
int spanY;
// We can create up to 523 vacant cells on a 4x4 grid, 100 seems
// like a reasonable compromise given the size of a VacantCell and
// the fact that the user is not likely to touch an empty 4x4 grid
// very often
private static final int POOL_LIMIT = 100;
private static final Object sLock = new Object();
private static int sAcquiredCount = 0;
private static VacantCell sRoot;
private VacantCell next;
static VacantCell acquire() {
synchronized (sLock) {
if (sRoot == null) {
return new VacantCell();
}
VacantCell info = sRoot;
sRoot = info.next;
sAcquiredCount--;
return info;
}
}
void release() {
synchronized (sLock) {
if (sAcquiredCount < POOL_LIMIT) {
sAcquiredCount++;
next = sRoot;
sRoot = this;
}
}
}
@Override
public String toString() {
return "VacantCell[x=" + cellX + ", y=" + cellY + ", spanX=" + spanX +
", spanY=" + spanY + "]";
}
}
分享到:
相关推荐
其中,"Android 4.0 Launch"指的是启动器(Launcher)的实现,这是用户与系统交互的首要界面。本文将深入探讨Android 4.0 Launch源代码,揭示其背后的设计理念和实现机制。 首先,我们关注的是`Launcher2`,它是...
在本项目"Android应用源码之BackgroundViewPager实现桌面launch移动"中,我们将深入探讨如何实现在桌面启动时移动应用,并通过BackgroundViewPager保持应用的可见性和交互性。 首先,我们需要理解ViewPager。...
下面将详细解释BackgroundViewPager的实现原理及其在桌面launch移动中的应用。 首先,ViewPager是Android SDK提供的一种强大的布局管理器,用于展示一系列可滑动的视图。通常,ViewPager的内容会随着用户的滑动而...
这个"Android BackgroundViewPager实现桌面launch移动"的项目是一个针对学生毕业设计的学习资源,它提供了一个实例,帮助学生理解如何在Android环境中创建一个能够动态切换后台页面的ViewPager,并实现桌面启动器的...
在Android开发中,"仿launch的Android界面"通常是指创建一个与系统启动器(launcher)类似的应用界面,这种界面往往包含滑动效果、图标展示、动态加载等元素,旨在提供用户友好的交互体验。在本案例中,我们将深入...
NeoStart-android_launch_application
本压缩包文件“BackgroundViewPager 实现桌面 launch 移动”提供了一个基于 ViewPager 的桌面启动器的实现方案,主要涉及以下知识点: 1. **ViewPager**:ViewPager 是 Android SDK 中一个用于在多个页面间滑动切换...
"安卓Android源码——BackgroundViewPager实现桌面launch移动"这个标题指出,我们将探讨的是一个关于Android操作系统中的特定技术实现。BackgroundViewPager是指在后台运行的ViewPager组件,它允许用户在桌面启动器...
1. **zygote的含义**:zygote意为“受精卵”,在Android中,zygote进程扮演着类似于受精卵的角色,它可以快速地“分裂”出多个进程。 2. **zygote的作用**: - **资源共享**:zygote进程中包含了Dalvik/ART虚拟机的...
学习这个源码,开发者可以掌握如何在Android应用中实现后台视图的持久化,以及如何有效地管理和控制后台活动,这对提升应用用户体验和实现高级功能非常有帮助。同时,这也是理解和实践Android生命周期管理、服务、...
在Android应用开发中,Activity是用户界面的基本组件,它负责展示屏幕内容并处理用户交互。了解Activity的不同启动模式是优化应用程序行为和管理Activity栈的关键。本篇将详细讲解"Standard"模式,这是Activity启动...
总之,"Android应用源码之BackgroundViewPager实现桌面launch移动.zip"是一个很好的学习资源,可以帮助开发者了解如何在Android中实现后台运行的ViewPager,提高用户体验,并掌握服务和服务与UI组件交互的技巧。...
ViewPager是Android SDK中的一个强大组件,用于展示可滑动的页面集合,而BackgroundViewPager则是在此基础上进行优化,以实现更丰富的交互效果,比如桌面launcher式的移动体验。 在Android应用开发中,ViewPager...
本项目名为“Android应用源码之BackgroundViewPager实现桌面launch移动”,主要涉及到Android的UI组件、自定义视图以及后台服务等多个核心知识点。下面,我们将详细探讨这些关键内容。 首先,我们关注的是...
本篇将深入探讨如何在Android 9.0中实现分屏模式,并提供相关的源码分析。 一、分屏模式概述 在Android 5.0(Lollipop)版本引入了多窗口模式,而在Android 7.0(Nougat)中正式引入了分屏模式。在Android 9.0中,...
在Android开发中,"BackgroundViewPager实现桌面launch移动"是一个常见的需求,它涉及到用户界面(UI)的设计和用户体验(UX)优化。BackgroundViewPager通常用于创建类似桌面启动器的效果,允许用户在后台浏览或切换...
Activity的启动模式(Launch Mode)是Android系统管理Activity实例的重要机制,它可以决定如何创建和管理Activity的生命周期。本篇文章将深入探讨`SingleTask`启动模式,并通过实际案例源码进行解析。 `SingleTask`...
"android实现火箭动画清理内存"这个主题就是关于如何在Android应用程序中结合火箭动画来模拟一个内存清理的过程,从而为用户提供一种直观且有趣的交互方式。在这个过程中,我们将深入探讨`Animation`类和`...
BackgroundViewPager是基于ViewPager的扩展,ViewPager是Android SDK中的一个控件,用于在多个页面间进行平滑的滑动切换,常用于实现滑动 tab 或者轮播图等效果。但是,原生的ViewPager在处理后台切换时可能无法满足...