UI和Rendering线程之间的Java / Android Share变量(结果不一致)

时间:2015-02-21 00:56:46

标签: android multithreading variables synchronized volatile

我面临的问题是我设置了一些花车,这些是:

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。也许我正在用跨线程的东西咆哮错误的树?但它似乎与此有关。

任何帮助和建议表示赞赏。

1 个答案:

答案 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 postgoogle

fyi:你应该这样做的原因都在stackoverflow链接中。

希望对Sir先生有所帮助。