解决 util(单例)类中的不一致问题



我有一个实用的单例类,它有一些参数。如果某些参数通过 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

最新更新