LocationManager常常调用onLocationChanged?

我已经设置了LocationManager来每2分钟获取当前位置:

locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 120000, 0, this); 

这工作正常,并按预期每2分钟调用onLocationChanged。 但是,似乎它每隔 2分钟在一个10-40(随机数)的秒范围内被多次调用。 我logging了onLocationChanged中收到的每个位置,以下是一些示例以了解正在发生的事情:

在17:30

 GPS 32.0 50.66318929195404 10.735434293746948 0.0 2010.08.07 17:30:10 GPS 32.0 50.66315710544586 10.735423564910889 0.0 2010.08.07 17:30:14 GPS 32.0 50.66314101219177 10.735418200492859 0.0 2010.08.07 17:30:17 GPS 32.0 50.66314101219177 10.735418200492859 0.0 2010.08.07 17:30:20 GPS 24.0 50.66313564777374 10.735418200492859 0.5 2010.08.07 17:30:24 GPS 32.0 50.663098096847534 10.735573768615723 0.0 2010.08.07 17:30:28 GPS 32.0 50.663065910339355 10.735611319541931 0.0 2010.08.07 17:30:31 

然后我没有更多的更新2分钟。

在17:32

 GPS 32.0 50.661821365356445 10.737022161483765 1.0 2010.08.07 17:32:39 GPS 16.0 50.66170871257782 10.737043619155884 1.8200275 2010.08.07 17:32:45 GPS 24.0 50.661579966545105 10.737027525901794 1.25 2010.08.07 17:32:50 GPS 16.0 50.66150486469269 10.73712408542633 1.0 2010.08.07 17:32:55 GPS 12.0 50.661579966545105 10.73715090751648 0.9013878 2010.08.07 17:33:01 GPS 24.0 50.66139221191406 10.737038254737854 1.5811388 2010.08.07 17:33:06 GPS 16.0 50.66141366958618 10.737301111221313 0.70710677 2010.08.07 17:33:12 GPS 16.0 50.66141366958618 10.737301111221313 0.70710677 2010.08.07 17:33:12 GPS 24.0 50.661311745643616 10.737070441246033 1.118034 2010.08.07 17:33:16 GPS 16.0 50.66122591495514 10.737177729606628 1.118034 2010.08.07 17:33:22 GPS 12.0 50.66124200820923 10.737220644950867 1.3462912 2010.08.07 17:33:26 GPS 12.0 50.661311745643616 10.737268924713135 3.6055512 2010.08.07 17:33:25 

等等…然后在17:35分钟后再更新一次。

这是标准的行为? 我期望每2分钟只能得到一个位置,而它给我的位置更新的时间似乎是随机的。 理想情况下,我宁愿只得到一个位置…有没有办法做到这一点?

Solutions Collecting From Web of "LocationManager常常调用onLocationChanged?"

requestLocationUpdates(String provider, long minTime, float minDistance, LocationListener listener)minTime参数:

“通知的最小时间间隔(以毫秒为单位),此字段仅用作提示以节省电量,位置更新之间的实际时间可能大于或小于此值。

所以你的问题的答案是,这是标准的行为,不,你不能改变这一点。

如果这对您是个问题,如果一段时间没有过去,您可以忽略对callback方法的调用。

我发现这个问题,因为我有同样的问题。

我相信我有答案。 由于您将meters参数设置为0,所以正在触发快速更新。

将米参数更改为10,如果您的位置更改10或更多,它将每隔2分钟触发LocationChanged事件。

在我做这个改变之前,LocationChanged每秒发射多次。 现在,它发生一次。 然后每隔2分钟,您将在状态栏上看到GPS图标,但除非您的位置发生变化,否则该事件不会触发。

我希望这有帮助。 这是对我来说固定的。 没有必要添加任何额外的逻辑来防止虚假的火灾。

这是我的LocationListener实现来过滤掉不必要的onLocationChanged()事件:

注我在我的服务中使用消息。

 public class GPSlocationListener implements LocationListener { //member variables private Handler mParentHandler;//points to Handler of parent private long mTimeBetweenLocationEvents; private long mTimeOfLastLocationEvent; private boolean mAccuracyOverride; private float mLastAccuracy; private boolean mOverrideLocation; //constants private static final float INVALID_ACCURACY = 999999.0f; private static final String TAG = "GPSlocationListener"; //constructor public GPSlocationListener(Handler parentMsgHandler, long timeBetweenLocationEvents, boolean accuracyOverride) { mParentHandler = parentMsgHandler; mTimeOfLastLocationEvent = 0; mAccuracyOverride = accuracyOverride; mLastAccuracy = INVALID_ACCURACY; mOverrideLocation = false; mTimeBetweenLocationEvents = timeBetweenLocationEvents; } //EVENT: onLocationChanged() // send GPS coordinates to CommService public void onLocationChanged(Location loc) { Log.d(TAG, "onLocationChanged() triggered. Accuracy = "+Float.toString(loc.getAccuracy())); mOverrideLocation = false; if (loc != null) { //if a more accurate coordinate is available within a set of events, then use it (if enabled by programmer) if (mAccuracyOverride == true) { //whenever the expected time period is reached invalidate the last known accuracy // so that we don't just receive better and better accuracy and eventually risk receiving // only minimal locations if (loc.getTime() - mTimeOfLastLocationEvent >= mTimeBetweenLocationEvents) { mLastAccuracy = INVALID_ACCURACY; } if (loc.hasAccuracy()) { final float fCurrentAccuracy = loc.getAccuracy(); //the '<' is important here to filter out equal accuracies ! if ((fCurrentAccuracy != 0.0f) && (fCurrentAccuracy < mLastAccuracy)) { mOverrideLocation = true; mLastAccuracy = fCurrentAccuracy; } } } //ensure that we don't get a lot of events // or if enabled, only get more accurate events within mTimeBetweenLocationEvents if ( (loc.getTime() - mTimeOfLastLocationEvent >= mTimeBetweenLocationEvents) ||(mOverrideLocation == true) ) { //be sure to store the time of receiving this event ! mTimeOfLastLocationEvent = loc.getTime(); //send message to parent containing the location object Message msgToMain = mParentHandler.obtainMessage(); msgToMain.what = Constants.MSG_LOCATION_CHANGED; msgToMain.obj = loc; mParentHandler.sendMessage(msgToMain); } } } public void onProviderDisabled(String provider) { // TODO Auto-generated method stub } public void onProviderEnabled(String provider) { // TODO Auto-generated method stub } public void onStatusChanged(String provider, int status, Bundle extras) { // TODO Auto-generated method stub } } 

这是在你的主要代码执行如下:

 //create the APIthread (which exposes mAPIhandler back to this service) mAPIthread = new APIthread(mApiHandler); mAPIthread.start(); //use the LocationManager class to obtain GPS locations locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); locationListener = new GPSlocationListener(mApiHandler, Constants.LOCATION_UPDATE_PERIOD_MSEC, true); //this will call GPSlocationListener.onLocationChanged() locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, //3 mins NOTE: approximate value Constants.LOCATION_UPDATE_PERIOD_MSEC, //no distance updates desired 0, locationListener);