我面临的问题是我设置了一些花车,这些是:
private volatile float yFromUI;
private volatile float yFromRenderThread;
private volatile float oldYFromUI;
private volatile float oldYFromRenderThread;
在我的 onTouch 方法中,我的 ACTION_MOVE 案例记录了当前和以前的位置(我只关注Y坐标)。像这样:
case MotionEvent.ACTION_MOVE: {
yFromUI = event.getY();
if (yFromUI==oldYFromUI){
Log.v("Test","Values match (from onTouch)");
}
oldYFromUI=yFromUI;
break;
}
然后,在我的渲染线程中(在我的主游戏循环中,因为这个应用程序是一个游戏) - 我抓住指针当前坐标的“快照”,如下所示:
@Override
public void updateLogic() {
if (pointerDown){
yFromRenderThread = yFromUI;
if (oldYFromRenderThread==yFromRenderThread){
Log.v("NewTag","Values match");
}
oldYFromRenderThread = yFromRenderThread;
}
}
问题
问题在于,当我向下(或向上)移动屏幕时,Log语句会在我的渲染线程(updateLogic)方法中被多次激活。这是不我所期望的,只要我的手指移动,这些值就永远不会匹配。
出于同样的原因,我不希望Log语句从UI线程(onTouch / ACTION_MOVE)触发,而且 不符合我的预期。
我猜这与跨线程通信有关,但我不确定如何解决它。
有人能够发现为什么旧的和当前的值通常都是从我的updateLogic方法记录的那样?
我已尝试同步这些方法,并尝试将我的变量操作放在 synchronized(Object)块中,您可以看到我已将它们声明为volatile。也许我正在用跨线程的东西咆哮错误的树?但它似乎与此有关。
任何帮助和建议表示赞赏。
答案 0 :(得分:0)
不,先生,我不认为这是一个编程错误 - 除了我认为这是一个基于浮动表示的数学错误这一事实。这是为你的浮动声明做这个
private volatile float yFromUI = 0.0000;
private volatile float yFromRenderThread = 0.0000;
private volatile float oldYFromUI = 0.0000;
private volatile float oldYFromRenderThread = 0.0000;
并且为了进行比较,请检查此stackoverflow post或google
fyi:你应该这样做的原因都在stackoverflow链接中。
希望对Sir先生有所帮助。