2011-07-05 2 views
0

Dans mon application, un utilisateur demande des mises à jour de position. Lorsque cela se produit, l'activité principale démarre un service qui lancera une demande de localisation.Problèmes d'emplacement avec Service et IntentService

Mon problème est, si les services sont démarrés, disons 3 fois dans une période de deux minutes, alors il ne fonctionne pas correctement. Donc, en gros, j'ai besoin du service pour mettre la demande de démarrage en attente jusqu'à ce que le démarrage actuel soit complètement terminé.

Chaque fois que mon service est démarré, il peut prendre jusqu'à dix minutes pour se terminer et le service répond différemment à chaque demande de démarrage en fonction des données d'intention qui lui ont été transmises. Je préférerais qu'il y ait une demande de localisation pour chacune des trois demandes de démarrage survenues dans la période de deux minutes, mais les données d'intention pourraient être différentes de chacune des trois demandes de démarrage.

Alors, j'ai essayé d'utiliser IntentService pour surmonter cela et gérer les trois demandes une à la fois, mais

LocationManager.requestLocationUpdates(...) 

est pas appelé. Je comprends que cela est probablement dû au fait que onHandleIntent (...) se termine presque immédiatement et ne donne essentiellement pas l'heure de la demande de localisation pour répondre. J'ai un gestionnaire qui arrête la demande de localisation après 7 minutes (3 minutes pour les tests), puis les informations de localisation sont transmises à d'autres méthodes qui retournent les mises à jour de l'interface utilisateur à l'utilisateur. Les mises à jour de l'interface utilisateur retournent, elles sont simplement nulles car les mises à jour de l'emplacement échouent. Je pense que je pourrais utiliser le onHandleIntent dans un IntentService pour démarrer mon service et lui transmettre les données d'intention, mais cela semble être une très mauvaise pratique, et il y a probablement une meilleure façon de le faire. EDIT: Cela ne fonctionnera certainement pas car onHandleIntent démarrera immédiatement my locationService, il n'y aura donc pas de période d'attente.

De même, tous les Toasts appelés dans onHandleIntent ne s'affichent pas du tout, bien que tout ce que mon onCreate() fonctionne fonctionne comme il se doit.

J'ai vraiment du mal à trouver une réponse à cette question, et toute aide serait grandement appréciée. Voici l'essentiel de mon code:

public class myService extends IntentService { 

public findMyDroidService() { 
       super("findMyDroidService"); 
      } 

@Override 
protected void onHandleIntent(Intent intent){ 

     intent.getExtras(); 
     fromIntentString = intent.getStringExtra("toIntentStringExtra"); 
     Toast.makeText(this, fromIntentString, Toast.LENGTH_SHORT).show(); 
     Toast.makeText(this, "Intent Handled", Toast.LENGTH_SHORT).show(); 
        locMan.requestLocationUpdates(locListener,...);  
} 
@Override 
public void onCreate(){ 
    super.onCreate(); 
    locListener = new LocationListener(){ 
       //code goes here 
    } 
} 
} 

En outre, ma position d'écoute est instancié dans le onCreate();

+0

Pour mon problème de pain grillé j'ai trouvé http://stackoverflow.com/questions/3955410/create-toast-from-intentservice mais je ne me soucie pas trop de la chose du toast, donc je ne l'ai pas essayé. – Jakar

Répondre

0

J'en étais vraiment très au courant. Dans ma situation, le problème était que je devais séparer toutes les données, donc la chaîne fromIntentString ne serait pas remplacée par de nouvelles demandes de démarrage. J'ai utilisé un tableau pour le faire, assez facilement.

public class myClass extends Service { 
     int arrayInt; 
     ArrayList<String> arrayStringList; 
     int myInt; 

     @Override 
     public void onCreate() { 
      super.onCreate() 
     arrayStringList = new ArrayList<String>(); 
     myInt = 0; 
    // additional code not important for this example 
     } 
@Override 
public void onStart(...){ 
handleCommand(intent); 
} 
@Override 
public void onStartCommand(...){ 
handleCommand(intent); 
return START_STICKY; 
} 
//I call both onstart and onStartCommand for backwards compatibility 
public void handleCommand(Intent intent){ 
    intent.getExtras(); 
    arrayStringList.add(intent.getStringExtra("fromIntentString")); 
// so I know it worked 
    Toast.makeText(this, arrayStringList.get(arrayInt).toString(), 
    Toast.LENGTH_SHORT).show(); 
//So I can keep track of the size of arrayStringList 
    ++arrayInt; 
//code for getting the location 
useMyData(); 
} 
public void useMyData(){ 
    // do location getting code 
    // Here's where I actually use my array. For this answer, I will just show a toast. 
Toast.makeText(getApplicationContext(), arrayStringList.get(myInt).toString(), 
Toast.LENGTH_SHORT).show(); 
    ++myInt; 
    if (myInt < arrayInt) useMyData(); 
    //I was going to use a for loop, but I couldn't get it to work, and I like this method 
    //better 

EDITS: j'utilisais déjà un tableau [chaîne] au lieu de ArrayList, mais cela ne fonctionne pas, parce que je devais être en mesure de se développer en permanence la taille de mon tableau, ce qui est possible. Les tableaux ont une taille fixe, donc j'ai utilisé un ArrayList, qui fonctionne maintenant.

Questions connexes