我找到了类似问题的答案,但尚未找到适合我的答案。我在helper类中有一个方法,它返回当前纬度的用户的String值。这是代码。
public String getLatitude(){
createLocationListener();
defineCriteria();
createLocationManager();
getLocation();
return String.valueOf(d_latitude);
}
我的问题是类变量d_latitude
在getLocation()
或更具体的onLocationChanged()
方法中正确更新,但getLatitude()
返回null d_latitude
在getLocation()
完成之前。就像我说的那样,我发现的解决方案无论出于什么原因都不适合我,或者它们对我的情况看起来太复杂了(200行特殊类等)。
private void getLocation(){
//get single shot location update, null looper sets single shot
locationManager.requestSingleUpdate(criteria, locationListener, null);
}
private void createLocationListener(){
locationListener = new LocationListener() {
@Override
public void onLocationChanged(android.location.Location location){
d_latitude = location.getLatitude();
Toast.makeText(Location.this, "olc lat= " +d_latitude, Toast.LENGTH_SHORT).show();
stopLocationListener();
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras){
}
@Override
public void onProviderEnabled(String provider){
}
@Override
public void onProviderDisabled(String provider){
}
};
}
答案 0 :(得分:0)
您需要了解异步函数和侦听器如何协同工作。
例如,如果您更改了方法
private void getLocation(LocationListener l) {
locationManager.requestSingleUpdate(criteria, l, null);
}
然后你可以传入监听器,它会回调该方法,然后等待"对于不同线程的响应。
您可以定义自己的回调接口以从外部获取纬度。
一个例子是
public interface MyLocatonListener {
void onLatChanged(Latitude lat);
void onLongChanged(Longitude lng);
}
你传递了一个这样的实例,但是,如果没有它,继续,因为你已经有了内置的监听器......
由于您无法保证立即回复,因此您无法return
使用此方法,因此请将其设为无效
public void getLatitude(){
defineCriteria();
createLocationManager();
getLocation(new LocationListener() {
@Override
public void onLocationChanged(android.location.Location location){
// latitude is "returned" here
d_latitude = location.getLatitude();
Toast.makeText(Location.this, "olc lat= " +d_latitude, Toast.LENGTH_SHORT).show();
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras){
}
@Override
public void onProviderEnabled(String provider){
}
@Override
public void onProviderDisabled(String provider){
}
});
// d_latitude == null here, most likely
}
另一个例子,您可以提取LocationListener
参数,直至getLatitude
方法,然后将其传递到getLocation
public void getLatitude(LocationListener l){
defineCriteria();
createLocationManager();
getLocation(l);
}
顺便说一句,我认为您可以在此方法之前定义标准和位置管理器