2009-10-08 9 views
3

J'ai écrit une application très simple qui demande à LocationProvider un emplacement et l'imprime à System.out. Cela fonctionne très bien dans le simulateur. Cependant, lorsque je l'exécute sur mon Blackberry, l'appel à getLocation semble suspendu indéfiniment. Je cours le code dans un fil séparé qui obtient simplement un fournisseur et demande l'endroit. Je l'ai essayé avec des critères Nuls (ce qui devrait me donner les défauts par défaut?) Ainsi qu'un critère qui devrait fournir une assistance puis autonome. J'ai inclus mon code ci-dessous. Quand je lance sur mon appareil, il se bloque sur l'appel à getLocation.Here est mon code below..plzz dire ce que je pourrais faire mal ...Blackberry - LocationProvider.getLocation() se bloque

public void getLocation() { 
    Thread t = new Thread(new Runnable() { 
     private double lat; 
     private double lon; 
     public void run() { 
      Criteria cr = new Criteria(); 
      cr.setHorizontalAccuracy(Criteria.NO_REQUIREMENT); 
      cr.setVerticalAccuracy(Criteria.NO_REQUIREMENT); 
      cr.setCostAllowed(false); 
      cr.setPreferredPowerConsumption(Criteria.NO_REQUIREMENT); 
      cr.setPreferredResponseTime(1000); 
      LocationProvider lp = null; 
      try { 
       lp = LocationProvider.getInstance(cr); 
      } catch (LocationException e) { 
      // System.out.println("*****************Exception" + e); 
      } 
      Coordinates c = null; 
      if (lp == null) { 
       UiApplication.getUiApplication().invokeLater(
        new Runnable() { 
        public void run() { 
         Dialog.alert("GPS not supported!"); 
         return; 
        } 
        }); 
      } else { 
       // System.out.println("OK"); 
       switch (lp.getState()) { 
       case LocationProvider.AVAILABLE: 
       // System.out.println("Provider is AVAILABLE"); 
         Location l = null; 
         try { 
         l = lp.getLocation(-1); 
        } catch (LocationException e) { 
        // System.out.println("***Location Exception caught " 
        // + e); 
        } catch (InterruptedException e) { 
        // System.out.println("***Interrupted Exception aught:" 
        // + e); 
        } catch (Exception e) { 
        // System.out.println("***Exception caught :" 
        // ;+ e); 
        } 
         if (l != null && l.isValid()) { 
         c = l.getQualifiedCoordinates(); 
        } 
        if (c != null) { 
          lat = c.getLatitude(); 
         lon = c.getLongitude(); 
         System.out.println(lat + " - " + lon); 
        } 
       } 
      } 
     } 
    }); 
    t.start(); 
} 

Répondre

4

essayer de:


En parlant de fils suspendus,

locationProvider.getLocation(-1) 

se bloque parce que si vous utilisez -1, il n'y aura pas de délai. Essayez ceci:

int timeout = 120; 
    try { 
     location = provider.getLocation(timeout); 
    } catch (LocationException e) { 
     System.out.println("Location timeout"); 
    } catch (InterruptedException e) { 
     System.out.println("InterruptedException"+e.getMessage()); 
    } 

De plus, si vous êtes en utilisant System.out.println(text) dans le simulateur, sur l'appareil, il serait préférable de

getApplication().invokeLater(new Runnable(){ 
    public void run() { 
     screen.add(new LabelField(text));   
    } 
}); 

ou

getApplication().invokeLater(new Runnable(){ 
    public void run() { 
     Dialog.inform(text);    
    } 
}); 
0

-1 chose délai d'attente devrait être ok, il devrait juste aller à la valeur par défaut. La valeur par défaut peut être élevée, mais si cela ne se produit pas en arrière-plan, vous pouvez définir le délai d'expiration à une valeur inférieure à 15 secondes.

La raison pour laquelle cela fonctionne dans le simulateur mais se bloque sur un périphérique réel est probablement que vous ne disposez pas d'une solution GPS sur l'appareil sur lequel vous faites le test ...

Je ne plaisante pas, ont Tu as essayé ça dehors?