0

因此,众所周知的事实是 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 开始后,Common.currentLocation 字符串得到更新。但是,我想在我的主要活动中等待,直到该字段更新。

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

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

4

2 回答 2

0

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

于 2012-05-31T10:44:04.947 回答
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); 
    } 
}

公共类 yourclass 扩展 Activity 实现 LocationEvents { ...

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

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

}

您还可以使用服务,或从您的班级广播意图。我建议,如果您的其他活动不需要该功能,则只需在现有活动中实现侦听器并前往那里

于 2012-05-31T14:15:02.177 回答