Проблема синхронизации при обновлении действия с геопозицией из службы (использование общих настроек для передачи геопозиции из службы в операцию) - PullRequest
0 голосов
/ 27 ноября 2010

В моем приложении активность запускает службу. Служба получает сетевое геоположение в своем методе onLocatioChanged и записывает его в Shared Preferences. Затем вызывает свой собственный stopSelf (); метод. Вернувшись в свою активность, я снова прочитал геопозицию из Shared Prefs.

Мой код на самом деле работает, единственная проблема в том, что геопозиция, которую моя активность считывает из общих префов, всегда с самого начала запуска сервиса. Службе требуются несколько миллисекунд для получения геопозиции - в течение этого времени активность прочитала устаревшую (предыдущую) геопозицию. Я искал форум, пытался запустить Servive в новой теме и ввел время ожидания в теме активности с помощью Thread.sleep (). Пока ничего не получалось.

Соответствующий код из моей Активности для запуска GeoServce.class и чтения общих привилегий:

btnGeoPos.setOnLongClickListener (new View.OnLongClickListener(){
            public boolean onLongClick(View v) {

            startService(new Intent(getApplicationContext(), GeoService.class));

                SharedPreferences mPrefs = getApplicationContext().getSharedPreferences("CurrentLoc", MODE_PRIVATE);
             DisplayLoc = mPrefs.getString("LocationTransfer", "not available");
             Toast.makeText(getApplicationContext(),"  GeoService retrieved:  "+DisplayLoc, Toast.LENGTH_LONG).show();

            return true;  //LongClick was consumed                   
    }          
    });

Это мой класс Service, который записывает геопозицию в SharedPrefs, он отлично работает как таковой:

public class GeoService extends Service {

 Location location = null;
 LocationManager lm;
 LocationListener ll;

 @Override
 public IBinder onBind(Intent intent) {
  // TODO Auto-generated method stub
  return null;
 }  



    public void onCreate() {           
        lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        ll = new MyLocationListener();         
        lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,1,1000, ll);    
        }    



    public void onStart(Intent intent, int startiD){}

 private class MyLocationListener implements LocationListener {

  public void onLocationChanged(Location location) {
   String message = String.format("Current Location \n Longitude: %1$s \n Latitude: %2$s",location.getLongitude(), location.getLatitude());
   Toast.makeText(GeoService.this, message, Toast.LENGTH_LONG).show();

   SharedPreferences mPrefs = GeoService.this.getSharedPreferences("CurrentLoc", MODE_PRIVATE);  
            SharedPreferences.Editor editor1 = mPrefs.edit();
     editor1.putString("LocationTransfer", message); // LocationTransfer is the key, message is the content passed    
     editor1.commit();

      lm.removeUpdates(ll);
   stopSelf();
  }

  public void onStatusChanged(String s, int i, Bundle b) {}

  public void onProviderDisabled(String s) {
   Toast.makeText(GeoService.this,"Network Location turned off",Toast.LENGTH_LONG).show();
  }

  public void onProviderEnabled(String s) {}

 }// End inner class

}// End Class

Этот блокпост держит меня в поисках уже несколько недель, я был бы признателен за любую помощь, спасибо всем!

1 Ответ

0 голосов
/ 27 ноября 2010

У вас есть несколько вариантов:

  1. Сделайте так, чтобы вы подходили асинхронно: пусть Сервис уведомит Активность, когда это будет сделано. Для этого вы можете использовать BroadcastReceiver.

  2. Если эта служба недолговечна и используется только для вашей деятельности, вам не нужна эта служба. Вместо этого используйте AsyncTask.

...