2012-07-23 46 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