J'essaie de faire un usage intensif de l'API Location. Je n'ai aucun problème à faire une simple activité qui actualise un TextView avec un LocationListener, ça va. Le truc, c'est que je dois mettre tous les trucs Location dans quelque chose comme une classe Manager qui est appelée par l'activité principale. Donc je dois placer tout dans cette classe et passer le lieu à l'Activité. Ceci est l'activité:Emplacement et threads Android
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
g = new GPSManager(getApplicationContext());
t = new Thread(g);
t.start();
updateWithNewLocation(g.getLocation());
}
private void updateWithNewLocation(Location location) {
String latLongString;
TextView myLocationText;
myLocationText = (TextView)findViewById(R.id.loca);
if (location != null) {
double lat = location.getLatitude();
double lng = location.getLongitude();
latLongString = "Lat:" + lat + "\nLong:" + lng;
} else {
latLongString = "No location found";
}
myLocationText.setText("Your Current Position is:\n" +
latLongString);
}
Et ceci est le « gestionnaire » classe:
public GPSManager(Context context) {
locationManager = (LocationManager)context.getSystemService(service);
String service = Context.LOCATION_SERVICE;
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
criteria.setAltitudeRequired(false);
criteria.setBearingRequired(false);
criteria.setCostAllowed(true);
criteria.setPowerRequirement(Criteria.POWER_LOW);
provider = locationManager.getBestProvider(criteria, true);
}
public Location getLocation() {
return this.location;
}
private final LocationListener locationListener = new LocationListener() {
public void onLocationChanged(Location location) {
Manager.this.location=location;
}
public void onProviderDisabled(String provider){
locationManager.removeUpdates(this);
}
public void onProviderEnabled(String provider){ }
public void onStatusChanged(String provider, int status,
Bundle extras){ }
};
@Override
public void run() {
Looper.prepare();
locationManager.requestLocationUpdates(provider, 0, 0,
locationListener);
location = locationManager.getLastKnownLocation(provider);
Looper.loop();
Looper.myLooper().quit();
}
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
locationManager.removeUpdates(locationListener);
}
Le problème est que j'ai, eh bien, il ne fonctionne pas du tout! Si je mets ce code dans l'activité, aucun thread impliqué, cela fonctionne très bien. Mais de cette façon, il dit juste "aucun endroit trouvé". J'ai besoin de faire en sorte que la classe Manager soit toujours à l'écoute des changements, donc quand je demande l'emplacement actuel est mis à jour.
merci de répondre! Supprimer la classe de gestionnaire n'est certainement pas une option, mais en faire un service ou une application non plus, donc en faire un HandlerThread serait la meilleure solution. Le problème est, je ne peux trouver aucune information sur la façon de l'implémenter. Pouvez-vous me donner un coup de main supplémentaire? Merci :) – ferostar
@Peter Canthropus: Je n'ai jamais utilisé 'HandlerThread'. Parmi les quatre options, à mon humble avis, c'est le pire. Je suppose que la raison pour laquelle vous avez fait cela dans un «manager» est que vous voulez que cela fonctionne à travers plusieurs activités. Dans ce cas, le simple fait de forger un fil est une idée particulièrement mauvaise. Votre manager * doit * être lui-même "géré" par un composant conscient du cycle de vie de l'application Android, ce thread peut donc être fermé correctement lorsque l'application n'est pas au premier plan. – CommonsWare