2011-04-15 1 views
3

Je retire mes cheveux en essayant de trouver une bonne solution à ce problème. J'ai fait mon application pour qu'elle trouve mon emplacement. Cela semble trop compliqué mais assez facile. Cependant, à la suite des recommandations de Google, j'essaie maintenant d'exécuter ce code en tant que tâche asynchrone afin de ne pas bloquer l'interface utilisateur. Cependant, je n'arrive même pas à comprendre comment faire pour compiler le code, même si cela fonctionne. L'erreur est que locationManager ne peut pas être résolu lorsque je le référence pour supprimer les écouteurs. J'ai essayé d'utiliser le code affiché ici Android find GPS location once, show loading dialog. Cependant, dans cet exemple, currentLocation ne semble pas être référencé à quoi que ce soit et j'ai rencontré des problèmes pour essayer de le résoudre. J'ai gaspillé presque une journée entière à essayer de régler ce problème, alors j'apprécierais vraiment que quelqu'un puisse me diriger dans la bonne direction.Comment obtenir l'emplacement à l'aide d'AsyncTask

private class LocationControl extends AsyncTask<Context, Void, Location> { 
    public Location alocation; 

privé LocatoinManager LocationManager; J'ai donc changé le code avec vos recommandations et il compile maintenant. J'ai mis à jour le code ici pour représenter ce que je cours. J'obtiens une erreur d'exécution lorsque locationManager requestLocationUpdates. Voici le logCat. Des idées?

04-15 14:57:56.742: ERROR/AndroidRuntime(18328): Uncaught handler: thread AsyncTask #1 exiting due to uncaught exception 
04-15 14:57:56.942: ERROR/AndroidRuntime(18328): java.lang.RuntimeException: An error occured while executing doInBackground() 
04-15 14:57:56.942: ERROR/AndroidRuntime(18328):  at android.os.AsyncTask$3.done(AsyncTask.java:200) 
04-15 14:57:56.942: ERROR/AndroidRuntime(18328):  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:234) 
04-15 14:57:56.942: ERROR/AndroidRuntime(18328):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:258) 
04-15 14:57:56.942: ERROR/AndroidRuntime(18328):  at java.util.concurrent.FutureTask.run(FutureTask.java:122) 
04-15 14:57:56.942: ERROR/AndroidRuntime(18328):  at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:648) 
04-15 14:57:56.942: ERROR/AndroidRuntime(18328):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:673) 
04-15 14:57:56.942: ERROR/AndroidRuntime(18328):  at java.lang.Thread.run(Thread.java:1060) 
04-15 14:57:56.942: ERROR/AndroidRuntime(18328): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 
04-15 14:57:56.942: ERROR/AndroidRuntime(18328):  at android.os.Handler.<init>(Handler.java:121) 
04-15 14:57:56.942: ERROR/AndroidRuntime(18328):  at android.location.LocationManager$ListenerTransport$1.<init>(LocationManager.java:128) 
04-15 14:57:56.942: ERROR/AndroidRuntime(18328):  at android.location.LocationManager$ListenerTransport.<init>(LocationManager.java:126) 
04-15 14:57:56.942: ERROR/AndroidRuntime(18328):  at android.location.LocationManager._requestLocationUpdates(LocationManager.java:697) 
04-15 14:57:56.942: ERROR/AndroidRuntime(18328):  at android.location.LocationManager.requestLocationUpdates(LocationManager.java:619) 
04-15 14:57:56.942: ERROR/AndroidRuntime(18328):  at com.WasserSportLotse.WasserSportLotse$LocationControl.doInBackground(WasserSportLotse.java:62) 
04-15 14:57:56.942: ERROR/AndroidRuntime(18328):  at com.WasserSportLotse.WasserSportLotse$LocationControl.doInBackground(WasserSportLotse.java:1) 
04-15 14:57:56.942: ERROR/AndroidRuntime(18328):  at android.os.AsyncTask$2.call(AsyncTask.java:185) 
04-15 14:57:56.942: ERROR/AndroidRuntime(18328):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:256) 
04-15 14:57:56.942: ERROR/AndroidRuntime(18328):  ... 4 more 
04-15 14:58:23.451: ERROR/AndroidRuntime(18356): Uncaught handler: thread AsyncTask #1 exiting due to uncaught exception 
04-15 14:58:23.642: ERROR/AndroidRuntime(18356): java.lang.RuntimeException: An error occured while executing doInBackground() 
04-15 14:58:23.642: ERROR/AndroidRuntime(18356):  at android.os.AsyncTask$3.done(AsyncTask.java:200) 
04-15 14:58:23.642: ERROR/AndroidRuntime(18356):  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:234) 
04-15 14:58:23.642: ERROR/AndroidRuntime(18356):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:258) 
04-15 14:58:23.642: ERROR/AndroidRuntime(18356):  at java.util.concurrent.FutureTask.run(FutureTask.java:122) 
04-15 14:58:23.642: ERROR/AndroidRuntime(18356):  at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:648) 
04-15 14:58:23.642: ERROR/AndroidRuntime(18356):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:673) 
04-15 14:58:23.642: ERROR/AndroidRuntime(18356):  at java.lang.Thread.run(Thread.java:1060) 
04-15 14:58:23.642: ERROR/AndroidRuntime(18356): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 
04-15 14:58:23.642: ERROR/AndroidRuntime(18356):  at android.os.Handler.<init>(Handler.java:121) 
04-15 14:58:23.642: ERROR/AndroidRuntime(18356):  at android.location.LocationManager$ListenerTransport$1.<init>(LocationManager.java:128) 
04-15 14:58:23.642: ERROR/AndroidRuntime(18356):  at android.location.LocationManager$ListenerTransport.<init>(LocationManager.java:126) 
04-15 14:58:23.642: ERROR/AndroidRuntime(18356):  at android.location.LocationManager._requestLocationUpdates(LocationManager.java:697) 
04-15 14:58:23.642: ERROR/AndroidRuntime(18356):  at android.location.LocationManager.requestLocationUpdates(LocationManager.java:619) 
04-15 14:58:23.642: ERROR/AndroidRuntime(18356):  at com.WasserSportLotse.WasserSportLotse$LocationControl.doInBackground(WasserSportLotse.java:62) 
04-15 14:58:23.642: ERROR/AndroidRuntime(18356):  at com.WasserSportLotse.WasserSportLotse$LocationControl.doInBackground(WasserSportLotse.java:1) 
04-15 14:58:23.642: ERROR/AndroidRuntime(18356):  at android.os.AsyncTask$2.call(AsyncTask.java:185) 
04-15 14:58:23.642: ERROR/AndroidRuntime(18356):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:256) 
04-15 14:58:23.642: ERROR/AndroidRuntime(18356):  ... 4 more 

Répondre

25
public class FastMainActivity extends Activity { 

    Button searchBtn = null; 
    Intent locatorService = null; 
    AlertDialog alertDialog = null; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     searchBtn = (Button) findViewById(R.id.searchBtn); 

     searchBtn.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 

       if (!startService()) { 
        CreateAlert("Error!", "Service Cannot be started"); 
       } else { 
        Toast.makeText(FastMainActivity.this, "Service Started", 
          Toast.LENGTH_LONG).show(); 
       } 

      } 
     }); 

    } 

    public boolean stopService() { 
     if (this.locatorService != null) { 
      this.locatorService = null; 
     } 
     return true; 
    } 

    public boolean startService() { 
     try { 
      // this.locatorService= new 
      // Intent(FastMainActivity.this,LocatorService.class); 
      // startService(this.locatorService); 

      FetchCordinates fetchCordinates = new FetchCordinates(); 
      fetchCordinates.execute(); 
      return true; 
     } catch (Exception error) { 
      return false; 
     } 

    } 

    public AlertDialog CreateAlert(String title, String message) { 
     AlertDialog alert = new AlertDialog.Builder(this).create(); 

     alert.setTitle(title); 

     alert.setMessage(message); 

     return alert; 

    } 

    public class FetchCordinates extends AsyncTask<String, Integer, String> { 
     ProgressDialog progDailog = null; 

     public double lati = 0.0; 
     public double longi = 0.0; 

     public LocationManager mLocationManager; 
     public VeggsterLocationListener mVeggsterLocationListener; 

     @Override 
     protected void onPreExecute() { 
      mVeggsterLocationListener = new VeggsterLocationListener(); 
      mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 

      mLocationManager.requestLocationUpdates(
        LocationManager.NETWORK_PROVIDER, 0, 0, 
        mVeggsterLocationListener); 

      progDailog = new ProgressDialog(FastMainActivity.this); 
      progDailog.setOnCancelListener(new OnCancelListener() { 
       @Override 
       public void onCancel(DialogInterface dialog) { 
        FetchCordinates.this.cancel(true); 
       } 
      }); 
      progDailog.setMessage("Loading..."); 
      progDailog.setIndeterminate(true); 
      progDailog.setCancelable(true); 
      progDailog.show(); 

     } 

     @Override 
     protected void onCancelled(){ 
      System.out.println("Cancelled by user!"); 
      progDialog.dismiss(); 
      mLocationManager.removeUpdates(mVeggsterLocationListener); 
     } 

     @Override 
     protected void onPostExecute(String result) { 
      progDailog.dismiss(); 

      Toast.makeText(FastMainActivity.this, 
        "LATITUDE :" + lati + " LONGITUDE :" + longi, 
        Toast.LENGTH_LONG).show(); 
     } 

     @Override 
     protected String doInBackground(String... params) { 
      // TODO Auto-generated method stub 

      while (this.lati == 0.0) { 

      } 
      return null; 
     } 

     public class VeggsterLocationListener implements LocationListener { 

      @Override 
      public void onLocationChanged(Location location) { 

       int lat = (int) location.getLatitude(); // * 1E6); 
       int log = (int) location.getLongitude(); // * 1E6); 
       int acc = (int) (location.getAccuracy()); 

       String info = location.getProvider(); 
       try { 

        // LocatorService.myLatitude=location.getLatitude(); 

        // LocatorService.myLongitude=location.getLongitude(); 

        lati = location.getLatitude(); 
        longi = location.getLongitude(); 

       } catch (Exception e) { 
        // progDailog.dismiss(); 
        // Toast.makeText(getApplicationContext(),"Unable to get Location" 
        // , Toast.LENGTH_LONG).show(); 
       } 

      } 

      @Override 
      public void onProviderDisabled(String provider) { 
       Log.i("OnProviderDisabled", "OnProviderDisabled"); 
      } 

      @Override 
      public void onProviderEnabled(String provider) { 
       Log.i("onProviderEnabled", "onProviderEnabled"); 
      } 

      @Override 
      public void onStatusChanged(String provider, int status, 
        Bundle extras) { 
       Log.i("onStatusChanged", "onStatusChanged"); 

      } 

     } 

    } 

} 
+4

@All Ceci est l'extrait de code parfait, pour obtenir l'emplacement (coordonnées GPS) tout en utilisant la tâche Aysnc avec Progress Dialog. – SALMAN

+0

+1. Ceci est un excellent exemple qui évite les boucles, ce qui peut être déroutant. – rmigneco

+4

Ce code n'exécute pas le gestionnaire d'emplacement en arrière-plan, mais dans la méthode onPreExecute(), qui s'exécute dans le thread d'interface utilisateur. –

1

Tout d'abord pour résoudre votre problème de compilation, mouvement

LocationManager locationManager = (LocationManager)params[0].getSystemService(Context.LOCATION_SERVICE);   

Alors que c'est une variable membre privée de la classe.

LocationManager n'a pas besoin d'être dans une asyncTask. Il ne lie pas l'interface utilisateur, toutes les mises à jour sont déjà asynchrones. Cela ajoutera simplement une complication inutile à votre projet.

Vous n'avez probablement qu'à déplacer useLocation dans onLockationChanged.

+0

merci, cela a fonctionné mais j'ai maintenant une erreur d'exécution – jiduvah

+0

Je suggère de se débarrasser de l'AsyncTask. L'erreur d'exécution peut simplement disparaître. –

+0

C'est comme ça que j'ai fait fonctionner l'application à l'origine, mais j'ai un écran de démarrage et je voudrais montrer une boîte de dialogue lorsque je reçois l'emplacement. Le dialogue gelait en faisant cela. d'où le besoin de l'asyntask. – jiduvah

0
public Location getLocation() 
{ 

    try 
    { 
     locationManager = (LocationManager) mContext.getSystemService(LOCATION_SERVICE); 

     // getting GPS status 
     isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); 

     // getting network status 
     isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER); 

     if (!isGPSEnabled && !isNetworkEnabled) 
     { 
      // no network provider is enabled 
      Log.w("DOCOMO-2","Network Connection failed"); 
     } 
     else 
     { 
      this.canGetLocation = true; 
      // First get location from Network Provider 
      if (isNetworkEnabled) 
      { 

       locationManager.requestLocationUpdates(
         LocationManager.NETWORK_PROVIDER, 
         MIN_TIME_BW_UPDATES, 
         MIN_DISTANCE_CHANGE_FOR_UPDATES, this); 
       if (locationManager != null) 
       { 
        location = locationManager 
          .getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 
        if (location != null) 
        { 
         latitude = location.getLatitude(); 
         longitude = location.getLongitude(); 
        } 
       } 
      } 
      // if GPS Enabled get lat/long using GPS Services 
      if (isGPSEnabled) 
      { 
       if (location == null) 
       { 
        locationManager.requestLocationUpdates(
          LocationManager.GPS_PROVIDER, 
          MIN_TIME_BW_UPDATES, 
          MIN_DISTANCE_CHANGE_FOR_UPDATES, this); 
        if (locationManager != null) 
        { 
         location = locationManager 
           .getLastKnownLocation(LocationManager.GPS_PROVIDER); 
         if (location != null) 
         { 
          latitude = location.getLatitude(); 
          longitude = location.getLongitude(); 
         } 

        } 
       } 
      } 
     } 
     locationManager=null; 
     location=null; 

    } 
    catch (Exception e) 
    { 
     locationManager=null; 
     location=null; 
     e.printStackTrace(); 
    } 
    return location; 
} 
3

ajouter juste Looper.prepare() avant d'appeler locationManager.requestLocationUpdates(locationManager.GPS_PROVIDER, 0, 0, locationListener); Rappelez-vous d'appeler Looper.loop() après.

+0

omg cela fonctionne. Je vous remercie. – Anderson

+0

qu'en est-il si je veux arrêter cette boucle? – Anderson

Questions connexes