0
头像

检测插件级别的序列变化

有没有办法创建一个全局序列更改侦听器,每次删除、插入或更改任何核苷酸时都会调用该侦听器?

 

Thank you,

阿德里安

阿德里安

5 条评论

0
头像

嗨,阿德里安, 

对你的问题的简短回答是否定的。

你能详细说明你为什么需要这个吗?  可能有一种不同的方法适合您。

干杯,
马修

Geneious Team 0 票
评论动作 永久链接
0
头像

嗨,马特,

我需要执行一项昂贵的计算,只有当序列发生变化时,统计数据和图表以及可能的其他地方都需要这种计算。现在我在多个地方这样做,这是多余的、昂贵的和凌乱的。

也许我们在 AnnotatedPluginDocument 上添加了一个监听器。

干杯,

阿德里安

阿德里安 0 票
评论动作 永久链接
0
头像

嗨,阿德里安,

如果您正在使用 SequenceGraph,那么 Geneious 会告诉您的图表取消当前计算并重新开始。  因此,您可能不需要文档侦听器。  这是通过从提供给计算方法的 ProgressListener 上的 isCancelled() 方法返回 true 来完成的。  Geneious 将再次调用计算方法。

如果您需要从支持相同行为的多个地方同步计算,那么您可以考虑使用静态计算器类,该类根据 URN 和文档的修改日期缓存和重用结果。  如果将缓存保留在内存中,则必须小心丢弃不再需要的结果,否则最终会导致内存泄漏。

---

关于文档侦听器,实际上看起来我错了。  您可以使用以下方法添加侦听器:

AnnotatedPluginDocument.addWeakReferenceDocumentListener ()

它只会在保存文档时被触发,而不是像 SequenceGraph 那样响应实时编辑。  所以如果那没问题,那么你可以采用它而不是我之前的建议。

干杯,
马修

马修·张 0 票
评论动作 永久链接
0
头像

马特,

我已经在使用单例将结果缓存在内存中,我在代码中的几个地方清除了它,但我正在寻找一个可以将其放入的地方,以确保它在移动时不会保留在内存中另一个文件。

 

 

干杯,

阿德里安

阿德里安 0 票
评论动作 永久链接
0
头像

嗨,阿德里安,

一种方法是建立一个系统,用于在不再需要数据时发出通知。  只有当您需要数据的所有不同地方也有办法知道他们何时不再需要数据时,这才有效。  您需要在发出新请求时增加一个数字,并在通知不再需要时将其减少。  当它达到零时,您可以丢弃数据。

另一种可能更简单的方法可能是使用 WeakReference 来跟踪从文档到对象的映射。请参阅https://docs.oracle.com/javase/8/docs/api/java/lang/ref/WeakReference.html

您可以在班级的某个地方维护类似于以下内容的地图:

地图<WeakReference<AnnotatedPluginDocument> , 数据对象> dataByDocument

然后在后台运行一个清理线程,定期检查映射中的键。  如果 WeakReference 最终指向 null,则意味着 AnnotatedPluginDocument 已被垃圾收集,即不再使用,您可以丢弃 DataObject。

确保不要在任何地方强烈引用 AnnotatedPluginDocument,否则您将阻止 WeakReference 被垃圾收集。

干杯,
马修

马修·张 0 票
评论动作 永久链接