java-在遍历事件处理程序的集合时,如何安全地从*回调中删除处理程序?

java-在遍历事件处理程序的集合时,如何安全地从*回调中删除处理程序?,第1张

概述我有点不解.Java的文档告诉我们,使用Iterator对象遍历集合时,从集合中删除项目时没有定义的行为,这样做的唯一安全方法是使用Iterator.remove().然后,如果在遍历列表的过程中有一个处理程序确定是时候将其自身作为侦听器删除了,那么如何安全地从ArrayList中删除事件处理程序?/

我有点不解. Java的文档告诉我们,使用Iterator对象遍历该集合时,从集合中删除项目时没有定义的行为,这样做的唯一安全方法是使用Iterator.remove().

然后,如果在遍历列表的过程中有一个处理程序确定是时候将其自身作为侦听器删除了,那么如何安全地从ArrayList中删除事件处理程序?

// in public class dispatcherpublic voID dispatchEvent(){    Iterator<IEventHandler> iterator = mHandlers.iterator();    IEventHandler handler = null;    while(iterator.hasNext()){        handler = iterator.next();        handler.onCallbackEvent();    }}public voID insertHandler(IEventHandler h){    mHandlers.add(h);}public voID removeHandler(IEventHandler h){    mHandlers.remove(h);}

同时,处理程序是这样实例化的.

final dispatcher d = new dispatcher();d.insertHandler(new IEventHandler(){    @OverrIDe    public voID onCallbackEvent(){        Log.i(" callback happened ");        d.removeHandler(this);    }});

看到潜在的问题了吗?由于仍在使用Iterator进行迭代时,由于在该特定处理程序中声明了onCallbackEvent(),因此要从ArrayList中删除该处理程序.

这是一个棘手的问题吗?处理这种情况的安全方法是什么?

解决方法:

在实现事件系统时,这是一个非常常见的问题.唯一的解决方案是在更改时复制处理程序列表.您可以在insertHandler / removeHandler方法中自行完成此 *** 作,也可以只使用copyOnWriteArrayList.

总结

以上是内存溢出为你收集整理的java-在遍历事件处理程序的集合时,如何安全地从*回调中删除处理程序?全部内容,希望文章能够帮你解决java-在遍历事件处理程序的集合时,如何安全地从*回调中删除处理程序?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1092832.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存