2010-11-27 27 views
0

Dans mon application, une activité démarre un service. Le service obtient la géoposition réseau dans sa méthode onLocatioChanged et l'écrit dans Shared Preferences. Puis appelle son propre stopSelf(); méthode. De retour dans mon activité, j'ai de nouveau lu la géoposition de Prefs partagées.Problème de synchronisation lors de la mise à jour d'une activité avec géoposition à partir d'un service (utilisation des préférences partagées pour transmettre la géoposition du service à l'activité)

Mon code fonctionne réellement, le seul problème est que la géoposition que mon activité lit dans les préférences partagées, provient toujours du début privé du service. Le service a besoin de quelques millisecondes pour obtenir la géoposition - pendant ce temps, l'activité a lu la géoposition obsolète (précédente). J'ai recherché sur le forum, essayé de démarrer le Servive dans un nouveau sujet et introduit le temps d'attente dans le thread d'activité en utilisant Thread.sleep(). Rien n'a fonctionné jusqu'ici.

Le code correspondant de mon acivités pour commencer GeoServce.class, et lire partagés Prefs:

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     
    }   
    }); 

Ceci est ma classe de service qui écrit le géoPosition dans SharedPrefs, il fonctionne très bien en soi:

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 

Ce barrage routier me permet de chercher depuis des semaines, j'apprécierais toute aide, merci à tous!

Répondre

0

Vous avez plusieurs options:

  1. approche asynchrone qui vous rend: laisser avertir le service d'activité quand il est fait. Vous pouvez utiliser BroadcastReceiver pour y parvenir.

  2. Si ce service est de courte durée et uniquement utilisé en interne par votre activité, vous n'avez pas besoin de service. Utilisez AsyncTask à la place.