一旦GPS更新开始,Android GPSListener会收到通知

时间:2012-05-31 06:57:13

标签: android gps locationlistener

因此众所周知,GPS接收器锁定卫星需要一段时间(约10-12秒)。使用Android LocationListener我希望在位置更新开始时收到通知。例如:

我有一个带有以下代码的活动来实例化并调用LocationListener

public void startLocationUpdates() {
    try{
    Common.locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
            listener = new LocListener();
            if(Common.locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
                Common.locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, listener);
            } else if(Common.locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
                Common.locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, listener);
            }
        }catch(Exception e) {
            e.printStackTrace();
        }
    }

这是LocationListener onLocationChanged实现。

public void onLocationChanged(Location location) {
        // TODO Auto-generated method stub
        try{
            Common.currentLocation = new String(String.valueOf(location.getLatitude()) + "," + String.valueOf(location.getLongitude()));
            Log.i("LocListener",Common.currentLocation);
        } catch(Exception e) {
                e.printStackTrace();
        }

    }

在locationUpdates start之后,Common.currentLocation字符串会更新。但是,我想在我的主要活动中等待,直到更新此字段。

如果我在活动中放置while循环以等待更新Common.currentLocation字段,则线程将被挂起并且不会调用onLocationChanged方法(不会打印日志消息)。

只要调用onLocationChanged并且纬度和经度值可用,从onLocationChanged方法更新到公共接口/活动的最佳方法是什么?任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

您不应该忙于等待(例如在循环中)进行位置更新。 LocationManager实现了requestSingleUpdate(String provider, PendingIntent intent)方法。请考虑使用PendingIntent通知您的活动更新可用。还有其他各种形式的requestSingleUpdate,有关详细信息,请参阅此处: http://developer.android.com/reference/android/location/LocationManager.html

答案 1 :(得分:0)

如果您需要将侦听器放在一个类中以实现可用性目的,那么有许多方法可以提供信息

要记住的重要事情是Android是一个事件驱动的系统,因此通过轮询而不是“等待”结果,你需要创建一种方法让类创建一个偶数然后响应任何感兴趣的方事件。

如果您不需要可用性,最简单的方法就是在同一个活动中简单地实现监听器并在那里进行处理,例如

public class yourclass extends Activity implements LocationListener {
  ...

  public void onLocationChanged(Location location) {
     ...
  }

}

下一个最简单的方法是在你的类中使用监听器创建一个接口,所以这不是没有错误的,而是从内存中获得了一般的想法,实际上这只是在你的类和事件监听器之间放置一层但它确实将你的听众隔离成一个可以被其他活动轻易使用的类,也不是我没有做任何事情来考虑多个活动注册注销等。

public mylistenerclass implements LocationListener {
   ...

   public interface LocationEvents { 
      public abstract void onLocationEvent(Location location); 
   }

   LocationEvents mListener = null; 

   public void registerForEvents(LocationEvents eventListener, ... any-params) {
      ... start listening for location stuff
      mListener = eventListener;

   }

    public void unregisterForEvents(LocationEvents eventListener) {
      ... end listening for location stuff
      mListener = null;

    } 

    public void onLocationChanged(Location location) {
         ... 
         if (null != mListener)
            mListener.onLocationEvent(location); 
    } 
}

public class yourclass extends Activity实现LocationEvents {       ...

  @Override
  public void onResume() {
      super.onResume();      
      registerForEvents(locationEvent, anyparams); 
  }

  @Override
  public void onPause() {
      super.onPause();      
      unregisterForEvents(locationEvent); 
  }

}

您也可以使用服务,或广播您班级的意图。我建议,如果您的其他活动不需要功能,只需从现有活动中实现监听器开始,然后去那里