为什么我的方法在中间返回?

时间:2013-07-24 05:08:17

标签: java android

以下方法仅执行一半:

public void onLocationChanged(Location newLocation) {
    double lat = newLocation.getLatitude();
    double lon = newLocation.getLongitude();
    boolean firstGoodFix = (waitingForLoc && newLocation.getAccuracy() < 30); // <= EXECUTION STOPS AFTER THIS LINE
    if (currentLocation == null || firstGoodFix) {
        LatLng myLocation = new LatLng(lat, lon);
        map.animateCamera(CameraUpdateFactory.newLatLng(myLocation));
    }
    currentLocation = newLocation;
    if (firstGoodFix) {
        sendMyLocation(newLocation);
        waitingForLoc = false;
    } else {
        sendMyLocation();
    }
}

当我单步执行代码时,它会正常执行直到指示的行,然后跳转到右括号,其余的代码永远不会执行。

newLocation有效,waitingForLoc也是如此(真)。 newLocation.getAccuracy()应该在1000左右返回。 currentLocation为空。 firstGoodFix没有出现在方法末尾的变量列表中,这导致我认为该行未完成。

这里发生了什么?

修改

按照下面的建议,我稍微改变了方法的结构,并发现无论我做什么,只要读取waitingForLoc的值,该方法就会停止执行。唯一能让它发挥作用的是完全删除变量。

我还尝试将waitingForLoc = true设置为方法的第一行,以确保它有一个值,这没有任何区别。以前它是在onResume()中设置的。

所以现在我的问题变成:为什么读取这个变量会导致执行停止? LogCat中似乎没有任何相关输出。

4 个答案:

答案 0 :(得分:0)

你有一个方法。将构成firstGoodFix布尔值的部分拆分为单独的布尔值,然后重新运行到firstGoodFix中,以查看该方法是否返回的内容不可能小于(或大于或等于)30(如NAN或一个错误,上帝知道:)。

答案 1 :(得分:0)

可能是因为

(waitingForLoc && newLocation.getAccuracy() < 30);

这就像(true && 1000 < 30)。我认为编译器首先尝试获取true && 1000的输出。这就是该方法在中间停止执行的原因。尝试将此行更改为(waitingForLoc && (newLocation.getAccuracy() < 30));。让我知道会发生什么。我希望这会对你有所帮助。

答案 2 :(得分:0)

由于newLocation.getAccuracy()返回1000并且waitingForLoc是布尔变量,请尝试将代码更改为:

//Store value of function in a local variable
boolean getAccuracyValue = false;
if(newLocation.getAccuracy() < 30)
{
  getAccuracyValue=true;
}

//Now set the firstGoodFix

boolean firstGoodFix=(waitingForLoc && getAccuracyValue);

理想情况下,您的解决方案应该有效。但我假设问题是由于功能。我不知道为什么。

答案 3 :(得分:-2)

尝试在您的行中使用括号,如下所示:

boolean firstGoodFix = (waitingForLoc && (newLocation.getAccuracy() < 30) );

注意比较中的额外括号。

PS:对于那些对我的回答投票的人,您是否愿意发表评论并解释为什么要投票?我只是想帮忙,这样你只是劝阻别人帮助别人......