以下方法仅执行一半:
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
中似乎没有任何相关输出。
答案 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:对于那些对我的回答投票的人,您是否愿意发表评论并解释为什么要投票?我只是想帮忙,这样你只是劝阻别人帮助别人......