Android GPSListener получает уведомление, когда начинаются обновления GPS

Хорошо известно, что 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();
        }

    }

Строка Common.currentLocation обновляется после запуска locationUpdates. Однако я хочу подождать в своей основной деятельности, пока это поле не будет обновлено.

Если я добавлю цикл while в свою активность, чтобы дождаться обновления поля Common.currentLocation, поток приостанавливается, а метод onLocationChanged не вызывается (сообщения журнала не печатаются).

Каков наилучший способ получить обновление от метода onLocationChanged к общему интерфейсу/действию, как только будет вызван onLocationChanged и станут доступны значения широты и долготы? Любая помощь будет оценена.


person Pradeep Banavara    schedule 31.05.2012    source источник
comment
Ваш прослушиватель местоположения находится в том же действии, где вы запрашиваете обновления?   -  person Idistic    schedule 31.05.2012
comment
Нет, это другой класс. Должен ли я вместо этого сделать это частным внутренним классом в действии?   -  person Pradeep Banavara    schedule 31.05.2012


Ответы (2)


Если вам нужно поместить прослушиватель в класс для повторного использования, существует ряд методов для предоставления информации.

Важно помнить, что 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 расширяет действие, реализует LocationEvents { ...

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

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

}

Вы также можете использовать службу или транслировать намерения из своего класса. Я предлагаю, однако, если ваши другие действия не нуждаются в функциональности, просто начните с реализации слушателя в вашей существующей деятельности и перейдите туда

person Idistic    schedule 31.05.2012
comment
Спасибо, я попробую первый вариант и возьму его оттуда. - person Pradeep Banavara; 31.05.2012
comment
жаль чувак был болен некоторое время. Получит эту работу и примет ответ. - person Pradeep Banavara; 04.06.2012
comment
Итак, наконец-то дошли руки до этого. Реализовал locationListener в основном действии, и все выглядит хорошо. Спасибо. - person Pradeep Banavara; 26.06.2012

Вы не должны ждать (например, в цикле) обновления местоположения. LocationManager реализует метод requestSingleUpdate(String provider, PendingIntent intent). Рассмотрите возможность использования PendingIntent, чтобы сообщить вашей активности, что обновление доступно. Существуют различные другие формы requestSingleUpdate. Дополнительную информацию см. здесь: http://developer.android.com/reference/android/location/LocationManager.html

person Stefan    schedule 31.05.2012
comment
Получил это, но мне нужно отправлять уведомления не только одному действию, но мне нужно отправлять уведомления двум действиям. Не удалось найти способ сделать это с помощью PendingIntent. Если есть способ, пожалуйста, дайте мне знать. - person Pradeep Banavara; 26.06.2012
comment
Отправьте уведомление (например, упомянутое выше PendingIntent) одному компоненту (например, Activity) и распространите оттуда информацию. Для этого вы можете использовать любой способ связи, предоставляемый Android, который подходит для вашей ситуации, например. трансляции или сообщения. - person Stefan; 04.07.2012