- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想我是另一个尝试使用 WeakHashMap 创建某种缓存的人。我需要一些帮助。
我有一堆 TrackData
对象,其中包含有关音轨的信息。然后是 Track
对象,它们保持对内部 TrackData
的引用。多个轨道可以指向相同的 TrackData
。然后我有如下所示的 TrackDataCache
类:
public class TrackDataCache {
private static TrackDataCache instance = new TrackDataCache();
public static TrackDataCache getInstance() {
return instance;
}
private WeakHashMap<TrackData, WeakReference<TrackData>> cache = new WeakHashMap<TrackData, WeakReference<TrackData>>();
public void cache(Track track) {
TrackData key = track.getTrackData();
WeakReference<TrackData> trackData = cache.get(key);
if (trackData == null) {
cache.put(key, new WeakReference<TrackData>(key));
} else {
track.setTrackData(trackData.get());
}
}
}
因此,当我加载轨道时,我调用 TrackDataCache.cache()
并且如果之前未加载其轨道数据,则将其缓存或替换为缓存副本,否则 (TrackData
覆盖 equals() 方法来检查位置和子歌曲索引)。我想使用弱引用,以便在删除 Tracks 时不需要关心。
我想问一下,在 WeakHashMap 中保留对键的弱引用是否是一种好的做法,如果不行,我应该如何处理这个问题?我需要弱引用和缓存值的恒定时间检索。我正在考虑复制 WeakHashMap 代码并公开 getEntry()
方法,这解决了问题,但这是一个糟糕的 hack :(
附言。我知道 apache 或 google collections 可能有这样的东西,但我真的不想添加 2Mb 依赖项。
最佳答案
我建议更换 WeakReferences
与 SoftReferences
.
任何仅由 WeakReference
引用的对象是每一轮垃圾收集器的目标。这意味着即使仍有足够的可用内存,您的缓存也可以被清除。
如果你替换WeakReference
与 SoftReference
然后你声明:仅当绝对没有可用内存可分配时才删除引用的对象。
没有现成的SoftHashMap
java中的实现。 Guava 中有一个很好的例子 - MapMaker
.值得在生产环境中使用这个经过良好测试和验证的代码,而不是提供您自己的绝对质量较低的实现。它还具有惊人的“自清洁”机制:
As the map size grows close to the maximum, the map will evict entries that are less likely to be used again. For example, the map may evict an entry because it hasn't been used recently or very often.
expireAfterWrite
指定 map 条目的过期时间|和 expireAfterAccess
方法。我也发现你的缓存设计不是很方便。据我从您的代码片段中了解到,从开始您的 Track
s 对他们的 TrackData
有很强的引用并根据这些情况构建缓存。但是从某些时刻开始,您想要使用缓存来检索数据,因此您必须创建新的 Track
它以其他方式出现,因为从那那一刻起,您想要使用缓存而不是强引用。
不同 Tracks
可以有相同的TrackData
所以我们不能使用 Track
作为 key 。所以,我会采用下一种方法:
Map<Integer, TrackData>
进行缓存具有软值和定义的自清洁策略(基于 MapMaker
);Track --> TrackData
至 Track --> Id (int)
.缓存 Id --> TrackData
.关于Java:需要有关 WeakHashMap 的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4354973/
据我所知,标准 jQuery“切换”功能在 jQuery mobile 中不起作用 - 这是正确的吗?如果是这样,还有其他有效的方法吗?我想做的就是打开和关闭“播放”按钮。所以按钮 ID 是“play
他们要求我提供一个“切换按钮”来打开和关闭集群有人可以帮助我实现集群的打开/关闭吗? 注意:加载超过30,000点 最佳答案 创建两层,一层有标记聚类,一层没有标记聚类,并将它们添加到传单控件中。例如
所以我想让我的 Python Gtk 小窗口有 2 个开关。当一个开关打开时,另一个开关关闭,反之亦然。我不太清楚如何控制这两个开关。如果有人能引导我走向正确的方向,我将不胜感激。 #!/usr/bi
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我为我的 android 应用程序集成了推送通知,我想为任何 android 手机/标签打开/关闭推送通知,任何人都可以帮助我... protected void onPostExecute(Blog
我遇到无法更改的问题 Switch运行时的 textOn/textOff 内容。这意味着,绑定(bind)到简单按钮(用于测试目的)的以下代码不起作用: private int _counter =
我正在开发一个应用程序来测试 iPhone 屏幕是关闭还是打开,我尝试了堆栈溢出中指定的加速度计代码,它在屏幕开启状态下运行良好,但是当我关闭屏幕时,加速度计没有停用。 所以我开始怀疑当屏幕关闭时加速
我想将前置闪光灯设置为自动闪光灯,因此前置摄像头不支持闪光灯,所以我必须将一个 View 设置为白色,以便它作为闪光灯使用,现在我的问题是如果用户设置了怎么办闪光模式自动?当我必须显示 Flash V
我有一个表,其中每隔一个表行都有一个类名“hideme”。在我制作的 css 文件中 .hideme { display:none} 隐藏行包含一个密码字段和一个按钮。在任何给定时间只能显示一个隐藏行
我正在尝试使用 css 切换复选框,使用开/关图像进行切换。但是它并没有发生,fiddle . I agree input[type=checkbox] { display:non
我正在为智能手机编写一个网站。我使用 javascript: navigator.geolocation.getCurrentPosition 来获取位置。 尽管如此,在执行此功能之前,我需要检测 G
如何在我的 Android 应用程序中以编程方式设置数据漫游开/关? 最佳答案 提前为重新打开一个死帖而道歉,但我已经通过调用这个可执行文件设法实现了它: su -c settings put glo
我正在用 java 编程,但我也可以采用 C++(甚至伪)代码,没问题。这是我的意思: 我有一个类似播放列表的东西,例如 List lsMyPlaylist .现在我想给用户洗牌的机会,然后再回到有序
我正在寻找最好的、最具可扩展性的方式来跟踪大量的开/关。开/关适用于项目,编号从 1 到大约 6000 万。 (在我的例子中,开/关是成员(member)的书是否被编入索引,这是一个单独的过程。) 开
我发现下面的代码可以以被动的方式做到这一点。 context.registerReceiver(this.ScreenOffReceiver, new IntentFilter(Intent.ACTI
我有一个脚本,我定期运行以使用 Applescript 打开/关闭灰度。它在 High Sierra 上运行良好,但当我在 Mojave 使用它时抛出异常。 tell application "Sys
如果我启动一个内联 Matplotlib 的 IPython Notebook,有没有办法随后绘制一个图形,以便它以“标准”、非内联的方式显示,而无需在没有内联命令的情况下重新加载笔记本? 我希望能够
如何使用Android中的CheckBoxPreference切换整个系统的声音,振动,数据连接和wifi? 我想在我的应用程序中正在运行 Activity 时禁用这些功能。 最佳答案 我想到了。 在
我想在我的网站上创建一个维护模式,我想放置一个只有管理员才能看到的按钮来打开/关闭维护模式。 这允许管理员继续查看网络,但其他访问者则不能。 我读过有关 catchAllRequest 的内容,创建一
如何检测客户端或服务器端 (ASP.NET) 的浏览器缓存设置。基本上尝试检测用户浏览器是否打开或关闭了缓存。如果关闭,我想将他们重定向到一个包含错误消息的页面,告诉他们打开它。这可能吗? 最佳答案
我是一名优秀的程序员,十分优秀!