2013-07-02 151 views
0

目前我正在做一個延遲發送到服務器GPS位置。位置(lat和long)需要每3分鐘發送一次,現在爲了測試目的,它每隔20秒發送一次,我正在記錄座標以驗證輸出。這裏的問題是,當我在地理修復模擬器中的位置(我沒有設備測試),記錄器類打印所有我最新的固定位置,而不僅僅是最後一個。與postDelayed處理程序的作品,這是我的課。Gps延遲位置

此代碼來自@kyogs。

public class LocalizadorGps extends Service { 
    private LocationManager mlocmag; 
    LocationListener mloclist; 
    private long UPDATE_INTERVAL; 
    private double latn,longn; 
    public Location loc; 

    public IBinder onBind(Intent intent) { 
     return null; 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 

     mlocmag = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
     mloclist = new MyLocationList(); 

     loc = mlocmag.getLastKnownLocation(LocationManager.GPS_PROVIDER); 

     if (loc == null) { 
      loc = mlocmag.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 
     } 

     updateServer(loc); 
     mlocmag.requestLocationUpdates(LocationManager.GPS_PROVIDER, 20000, 1000,mloclist); 


    } 

    public void updateServer(final Location loc) { 
     final Handler handler = new Handler(); 

     Runnable runnable = new Runnable() { 
      public void run() { 
       if (loc != null) { 
        final double latitude = loc.getLatitude(); 
        final double longitude = loc.getLongitude(); 
        Log.v("COORDINATES", Double.toString(latitude) + " " + Double.toString(longitude)); 
       } else { 
        System.out.println("Location not avilable"); 
       } 

       handler.postDelayed(this, 20000); 
      } 
     }; 
     handler.postDelayed(runnable, 20000); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     mlocmag.removeUpdates(mloclist); 
    } 

    @Override 
    public boolean stopService(Intent name) { 
     return super.stopService(name); 
    } 

    public class MyLocationList implements LocationListener { 

     public void onLocationChanged(Location location) { 
      updateServer(location); 
     } 

     public void onProviderDisabled(String provider) { 

     } 

     public void onProviderEnabled(String provider) { 

     } 

     public void onStatusChanged(String provider, int status, Bundle extras) { 

     } 

    } 
} 

我這樣做:

geo fix 44.41 56.75 

,輸出是:

06-27 04:03:55.736 13743-13743/com.example.testingui   
V/COORDINATES: 56.75 44.409998333333334 

然後我解決一個多個位置:

geo fix 44.44 80.33 

,輸出爲:

06-27 04:04:15.756 13743-13743/com.example.testingui   
V/COORDINATES: 56.75 44.409998333333334 
06-27 04:04:19.725 13743-13743/com.example.testingui   
V/COORDINATES: 80.32999833333334 44.43999833333334 

它重複先前固定的位置和新的位置。所需行爲只是最後一個位置。

,最後一個:

geo fix 44.44 33.67 

輸出:

06-27 04:04:35.767 13743-13743/com.example.testingui   
V/COORDINATES: 56.75 44.409998333333334 
06-27 04:04:39.686 13743-13743/com.example.testingui   
V/COORDINATES: 33.669999999999995 44.43999833333334 
06-27 04:04:39.736 13743-13743/com.example.testingui   
V/COORDINATES: 80.32999833333334 44.43999833333334 

它重複最後三個固定位置。 (看看輸出的時間)。再次,所需的行爲只是最後一個固定位置。

note:我用Timer而不是處理程序測試了這個,我得到了相同的結果!

所以我的問題在這裏,就是:

我在做什麼可怕的錯誤?我無法找到問題:(。

+0

只是好奇你爲什麼要在UpdateServer()函數中使用'final'關鍵字的位置變量? –

回答

0

它看起來並不像你實際上關閉線程。你試過沒有,每次旋轉了一個新的Runnable?

+0

所以我沒有嘗試。我在Runnable結束後添加了** handler.removeCallbacks(runnable); **,但它似乎不起作用。我得到相同的輸出。 – albertogg

0

它看起來像你排隊同一可運行經由兩個handler.postDelayed呼叫的兩倍,因此,第二個從Runnable.run內()被呼應從相同的可運行的第一執行相同的輸出排隊

此代碼:

Runnable runnable = new Runnable() { 
     public void run() { 
      if (loc != null) { 
       final double latitude = loc.getLatitude(); 
       final double longitude = loc.getLongitude(); 
       Log.v("COORDINATES", Double.toString(latitude) + " " + Double.toString(longitude)); 
      } else { 
       System.out.println("Location not avilable"); 
      } 

      handler.postDelayed(this, 20000); 
     } 
    }; 
    handler.postDelayed(runnable, 20000); 

...應更改爲:

Runnable runnable = new Runnable() { 
     public void run() { 
      if (loc != null) { 
       final double latitude = loc.getLatitude(); 
       final double longitude = loc.getLongitude(); 
       Log.v("COORDINATES", Double.toString(latitude) + " " + Double.toString(longitude)); 
      } else { 
       System.out.println("Location not avilable"); 
      } 
     } 
    }; 
    handler.postDelayed(runnable, 20000);