2012-07-23 45 views
0

我在使用传统的onLocationChanged调用获取位置更新的正确时间时遇到了一些问题。我已将GPS参数设置为requestLocationUpdates,并且我的getLatitude();getLongitude();getAltitude();值在适当的时间间隔内会更新,但我的时间值似乎滞后一个读数。我曾尝试拨打getTime()System.currentTimeMillis();拨打电话时拨打电话getLatitude();getLongitude();getAltitude();,但两种方式的延迟相同。由于我使用时间和地点来进行计算,所以这个滞后是一个问题。
我想到实现一个timer,然后实施一个位置呼叫,但真的不知道如何拉断。在位置更新期间获取时间值的问题

@覆盖 公共无效onLocationChanged(位置LOC) { /*获取当前速度*/ loc.getSpeed();

/* Assign speed value to double variable in meter/sec, convert to miles/hr, and convert to string*/ 
float currentSpeedInMeterPerSecond = loc.getSpeed(); 
float currentSpeed = currentSpeedInMeterPerSecond*2.237f; 

currentSpeedMPHInt = Math.round(currentSpeed); 

currentSpeedString = Integer.toString(currentSpeedMPHInt); 

/* Print out current speed */ 
TextView currentSpeedText = (TextView)findViewById(R.id.speed); 
currentSpeedText.setText(currentSpeedString); 

/* Get headwind, frontal area, drag coefficent (Cd), rolling coeffiecent (Cr) */ 
mySharedPreferences = getSharedPreferences(MY_PREFS, prefMode); 
headWindString = mySharedPreferences.getString("keyheadWindString", "0"); 
headWind = new Float(headWindString); 

frontalAreaString = mySharedPreferences.getString("keyfrontalAreaString", "6.6"); 
frontalArea = new Float(frontalAreaString); 

dragCoefficentString = mySharedPreferences.getString("keydragCoefficentString", "1.15"); 
dragCoefficent = new Float(dragCoefficentString);  

riderWeightString = mySharedPreferences.getString("keyriderWeightString", "205"); 
riderWeight = new Float(riderWeightString); 

bikeWeightString = mySharedPreferences.getString("keybikeWeightString", "30"); 
bikeWeight = new Float(bikeWeightString); 

rollingCoefficentString = mySharedPreferences.getString("keyrollingCoefficentString", "0.0075"); 
rollingCoefficent = new Float(rollingCoefficentString); 

/* get current time and location and speed and altitude*/ 
System.currentTimeMillis(); 
loc.getLatitude(); 
loc.getLongitude(); 
loc.getAltitude(); 

/* Set start time and location */ 
if (i < j) { 
    i = i + 1; 
    time1 = System.currentTimeMillis(); 
    altitudeStart = loc.getAltitude(); 
    altitudeA = loc.getAltitude(); 
    latA = loc.getLatitude(); 
    logA = loc.getLongitude(); 
    Location.distanceBetween(latA,logA, latB,logB, distance); 

}else{ 

    /* Get new location and time*/ 
    timeNew = System.currentTimeMillis(); 
    latB = loc.getLatitude(); 
    logB = loc.getLongitude(); 
    altitudeB = loc.getAltitude(); 

    /* Get distance between point A and point B*/ 
    Location.distanceBetween(latA,logA, latB,logB, distance); 
    distanceTraveledMeters = distance[0];   /* distance between A and B in meters*/ 
    distanceTraveledMiles = distanceTraveledMeters * 0.0006213712f; 
     if(distanceTraveledMiles<0.02f){ 
      distanceTraveledMiles = 0f; 
     } 
    /* Get and find time, total distance, average power , average speed, total Kcal, total elevation diff*/ 
    timeinterval = timeNew - time1; 
    timeintervalSec = timeinterval/1000f; 
    tripTimeTotalmin = tripTimeTotalmin + (timeintervalSec/60f); 
    totalDistance = totalDistance + distanceTraveledMiles; 
    averageSpeed = totalDistance/(tripTimeTotalmin/60f); 
    elevChange = (((altitudeB + altitudeA)/2) - altitudeStart)*3.2808d; 
    elevChangeFloat = (float)elevChange; 
    powerElevationChangeWattsAve = ((((riderWeight+bikeWeight)*32.174f)*elevChangeFloat)/tripTimeTotalmin)*0.00070234f; 
    intervalSpeedMPH = distanceTraveledMiles/(timeintervalSec/3600f); 
    powerAirResistanceWattsAve = (0.5f*dragCoefficent*0.075f*((averageSpeed+headWind)*(averageSpeed+headWind))*frontalArea*(averageSpeed+headWind))*0.13295f; 
    powerRollingResistanceWattsAve = rollingCoefficent*(riderWeight+bikeWeight)*32.174f*averageSpeed*0.062f; 
    powerTotalWattsAve = powerElevationChangeWattsAve+powerAirResistanceWattsAve+powerRollingResistanceWattsAve; 
    totalKcalBurned = (powerTotalWattsAve*tripTimeTotalmin*0.01433f)/0.24f; 
    mechBtuUsed = powerTotalWattsAve*tripTimeTotalmin*0.056869f; 


    /*Round off values*/ 
    totalDistance = totalDistance*10f; 
    totalDistance = Math.round(totalDistance); 
    totalDistance = totalDistance/10f; 

    tripTimeMin = Math.round(tripTimeTotalmin); 
    timeintervalSec = Math.round(timeintervalSec); 
    averageSpeedInt = Math.round(averageSpeed); 
    powerTotalWattsInt = Math.round(powerTotalWattsAve); 
    totalKcalBurnedInt = Math.round(totalKcalBurned); 
    intervalSpeedMPHInt = Math.round(intervalSpeedMPH); 
    mechBtuUsedInt = Math.round(mechBtuUsed); 
    elevChangeInt = Math.round(elevChangeFloat); 

    /*convert to stings*/ 
    totalDistanceString = Float.toString(totalDistance); 
    tripTimeTotalminString = Integer.toString(tripTimeMin); 
    averageSpeedString = Integer.toString(averageSpeedInt); 
    powerTotalWattsString = Integer.toString(powerTotalWattsInt); 
    totalKcalBurnedString = Integer.toString(totalKcalBurnedInt); 
    mechBtuUsedString = Integer.toString(mechBtuUsedInt); 
    elevChangeString = Integer.toString(elevChangeInt); 



    /* Print out */  
    TextView totalDistanceText = (TextView)findViewById(R.id.distance); 
    totalDistanceText.setText(totalDistanceString); 
    TextView tripTimeTotalminText = (TextView)findViewById(R.id.triptime); 
    tripTimeTotalminText.setText(tripTimeTotalminString); 
    TextView averageSpeedText = (TextView)findViewById(R.id.avespeed); 
    averageSpeedText.setText(averageSpeedString); 
    TextView powerTotalWattsText = (TextView)findViewById(R.id.watts); 
    powerTotalWattsText.setText(powerTotalWattsString); 
    TextView totalKcalBurnedText = (TextView)findViewById(R.id.burnedkcal); 
    totalKcalBurnedText.setText(totalKcalBurnedString); 
    TextView mechBtuUsedText = (TextView)findViewById(R.id.mechbtu); 
    mechBtuUsedText.setText(mechBtuUsedString); 
    TextView elevChangeText = (TextView)findViewById(R.id.elevchange); 
    elevChangeText.setText(elevChangeString); 





    /*reset start time and location and interval elevation */ 
    time1 = timeNew; 
    latA = latB; 
    logA = logB; 
    altitudeA = altitudeB; 

    /* check iterations*/ 
    k = k +1; 
    kString = Integer.toString(k); 
    TextView kStringText = (TextView)findViewById(R.id.k); 
    kStringText.setText(kString); 


} 
} 
+0

你是如何保存它知道它的一个滞后背后?通过落后你的意思,你会在t1时间收到更新,然后在t2收到更新,但是当你打印时,它仍然有t1? – 2012-07-23 19:53:50

+0

我把它写在我的屏幕上。距离改变,但时间不变,我可以从这些值中看出,OLD时间不是新时间用于计算。显然,应用程序运行的时间越长,错误越小,但它通常仍然过大。 – 2012-07-23 20:23:16

+0

计算完成在哪里?它在'onLocationChanged'函数中吗?我认为你将不得不张贴一些代码。我感觉你存储/检索时间戳的方式导致了问题。你能发布至少你的'onLocationChanged'代码和你的计算代码吗? – 2012-07-23 22:24:51

回答

0

这可能不是做的最好的方式,但在我的应用我加入以下行呼吁位置更新时间:

public final LocationListener locationListener = new LocationListener() { 
    public void onLocationChanged(Location location) { 
     SimpleDateFormat s = new SimpleDateFormat("hh:mm:ss"); 
     String timeStamp = s.format(new Date()); 

编辑:
我只用时间记录

07-23 15:50:58.110: I/LocationListener(27513): Time of location change: 03:50:58. Latitude: 35.3597361 Longitude: -76.4046144