我在这里遇到了一个非常奇怪的问题,对象状态错误,我在使用Handler.postDelayed
. 我使用它来安排 2D 绘图的绘图调用,并且此绘图代码检查某些状态字段(如整数和布尔值)。
现在,这些状态字段可能会在我安排抽奖后发生变化,但是由于所有方法,甚至延迟调用都在同一个线程上执行(对吗?),因此不应存在由于共享状态而导致的可见性问题。
尽管如此,我有时会看到例如false
在预定抽签中的标志,即使它不可能是,因为我true
在安排抽签之前将其设置为并且不再触摸它。一些伪示例代码:
public void scheduleDraw() {
boolean flag = true;
handler.postDelayed(runnable);
}
runnable = new Runnable() {
public void run() {
// flag is false here
}
}
这怎么可能发生?我不完全确定 Android 是如何实现这些消息循环的,但我检查了调度绘制的方法和调度方法本身的线程标识,它们都在同一个线程(主 UI 线程)上调用。
这让我发疯,有人可以帮忙吗?
更新 我注意到问题是由于内部类检查了一次标志,而外部类检查了一次。绘制代码作为内部类的一部分运行,并看到标志处于正确状态,而外部类,即使它包含对内部类实例的引用,总是将标志视为假(不正确的状态)。我仍然不明白这个问题,但它似乎与类嵌套有关?