2010-08-22 11 views
3

J'ai le code suivant que je veux être en mesure de faire une boucle toutes les 30 secondes.Thread Android Issue

MyLocation myLocation = new MyLocation(); 
    public LocationResult locationResult = new LocationResult() { 
     @Override 
     public void gotLocation(final Location location) { 
      GeoPoint myGeoPoint = new GeoPoint(
        (int) (location.getLatitude() * 1000000), 
        (int) (location.getLongitude() * 1000000)); 
      myMapController.animateTo(myGeoPoint); 
      myMapController.setZoom(10); 

      lat = location.getLatitude(); 
      lon = location.getLongitude(); 

      new OverlayTask().execute(); 


      Timer timer; 
      timer = new Timer(); 
      timer.scheduleAtFixedRate(new MyTimerTask(), 30000, 30000); 
     } 

    }; 

une fois que j'est congédié ai l'emplacement et le OverlayTask exécute bien, il exécutera également lorsqu'ils sont affectés à un élément de menu pour le forcer. Cependant, à l'intérieur de la minuterie, j'obtiens une erreur.

public class MyTimerTask extends TimerTask { 
    public void run() { 
     try { 
      Log.i(">>>>>>>>>>>> Refresh: ", "Success"); 
      new OverlayTask().execute(); 
     } catch (Exception e) { 
      Log.e(">>>>>>>>>>>> Error executing MyAsyncTask: ", e.getMessage(), e); 
     } 
    } 
} 

L'erreur est ....

Erreur exécution MyAsyncTask: (2573): Seul le thread d'origine qui a créé une hiérarchie de vue peut toucher son point de vue.

Répondre

3

utiliser la méthode runOnUiThread:

public class MyTimerTask extends TimerTask { 
    public void run() { 
     runOnUIThread(new Runnable(){ 
      public void run(){ 
       try { 
        Log.i(">>>>>>>>>>>> Refresh: ", "Success"); 
        new OverlayTask().execute(); 
       } catch (Exception e) { 
        Log.e(">>>>>>>>>>>> Error executing MyAsyncTask: ", e.getMessage(), e); 
       } 
      } 
     }); 
    } 
}