我有一个实用的单例类,它有一些参数。如果某些参数通过 setter 类型的方法发生更改,则类会通知订阅者这些更改。活动、片段和服务可以订阅这些更改。我在此类中有一个侦听器接口。订阅者必须实现接口定义的方法。
private static List<Listener> listeners = new ArrayList<>();
public static synchronized void addListener(Listener listener) {
listeners.add(listener);
}
public static synchronized void removeListener(Listener listener) {
listeners.remove(listener);
}
由于某些组件订阅和取消订阅此类,因此使用上述两种方法,侦听器大小变化良好。但是当调用某种二传手类型的方法时,如下所示:
public static synchronized void decrementPosition() {
if (position > 0) {
position--;
for (Listener listener : listeners) {
listener.positionChanged(position);
}
}
}
我在调试模式下看到,"侦听器"的大小与添加和删除不是最新的。似乎"listeners.remove(listener("不起作用,但是当我调试它时,看起来"侦听器"正在从列表中删除。当然,我得到了一个
java.lang.IllegalStateException: Handler (android.os.Handler) {3fc60df} sending message to a Handler on a dead thread
从类似二传手的方法。
我想你可以使用线程安全列表像下面一样https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CopyOnWriteArrayList.html