问题描述
所以我有一个GPS跟踪应用程序,我想在其中一个UI中显示我的数据(距离,速度等)。
我的LocationService.java跟踪前台服务中的所有指标:
public class LocationService extends Service implements LocationListener{
public ArrayList<Location> lastLocationResultArray = new ArrayList<>();
public float distance;
public float distanceKm;
public float ascent;
public float descent;
public float currentSpeed;
Location changedLocation;
double currentAltitude;
public float averageSpeed;
private static DecimalFormat df1 = new DecimalFormat("#");
private static DecimalFormat df2 = new DecimalFormat("#.#");
private static DecimalFormat df3 = new DecimalFormat("#.##");
public static final String EXTRA_DISTANCE = "com.example.iathleticsrecorder.EXTRA_DISTANCE";
public LocationCallback locationCallback = new LocationCallback(){
@Override
public void onLocationResult(LocationResult locationResult) {
super.onLocationResult(locationResult);
if(locationResult != null && locationResult.getLastLocation() != null){
Location actualLocation = locationResult.getLastLocation();
double latitude = locationResult.getLastLocation().getLatitude();
double longitude = locationResult.getLastLocation().getLongitude();
double altitude = locationResult.getLastLocation().getAltitude();
double speed = locationResult.getLastLocation().getSpeed();
Log.d("LOCATION_UPDATE",latitude + "," + longitude + "," + altitude + "," + locationResult);
currentSpeed = (float) (speed*3.6f);
changedLocation = actualLocation;
if(!lastLocationResultArray.isEmpty()) {
distance += changedLocation.distanceTo(lastLocationResultArray.get(lastLocationResultArray.size() - 1));
distanceKm = distance/1000;
Location lastlocation = lastLocationResultArray.get(lastLocationResultArray.size() - 1);
double lastAltitude = lastlocation.getAltitude();
double altitudeChange = altitude-lastAltitude;
if(altitudeChange<-9) {
descent += altitudeChange;
} else if(altitudeChange>9) {
ascent += altitudeChange;
}
}
lastLocationResultArray.add(changedLocation);
Log.d("ENDOFLOOP",distanceKm + "," + distance + "," + ascent + "," + descent + "," + currentSpeed + "," + averageSpeed );
}
}
};
public String getDistance() {
return df3.format(distance);
}
以下是如何从“ Log.d(ENDOFLOOP)”中添加所有指标的示例:
2020-10-05 19:32:55.486 20116-20116 / com.example.iathleticsrecorder D / ENDOFLOOP:0.0042962608858942986、4.22961、4.22961、22.800003,-22.800003、0.08298418,0.0
所以我知道在LocationService类顶部声明的变量正在更改(如log.d所示),但是当我尝试从另一个类获取数据时,它将仅显示“ 0”在文本视图中,就好像它不从LocationService.class中获取更新的值,而是仅获取声明的值(即使我并没有考虑任何值,仅获取变量)。这是连接到StartedSession.java中的UI的代码片段:
我声明了LocationService类:
LocationService mLocationService = new LocationService();
并使用getter通过按钮获取float变量的值:
btUpdateNumbers = findViewById(R.id.btUpdateNumbers);
btUpdateNumbers.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
txtViewDistance.setText(mLocationService.getDistance());
//txtViewCurrentSpeed.setText(mLocationService.getSpeed());
}
});
为什么只显示“ 0”?
解决方法
使用可帮助您解决问题的SharedPreferences。