LocationListener InSide AsyncTask - PullRequest
2 голосов
/ 22 июля 2011

Привет, я новичок в программировании для Android и в настоящее время разрабатываю приложение, которое использует диспетчер местоположений для определения местоположения пользователя и размещения маркера на карте. я пытаюсь использовать AsyncTask для запуска LocationListener и постоянно обновлять маркер, когда местоположение пользователя изменилось. это класс, над которым я работаю ...

public class IncidentActivity extends MapActivity{


   public void onCreate(Bundle savedInstanceState){
       super.onCreate(savedInstanceState);
       this.setContentView(R.layout.incidentactivity);

       mapView = (MapView)findViewById(R.id.mapView);
       mapView.setBuiltInZoomControls(true);   
       mapView.setTraffic(true);


        mapController = mapView.getController();
        String coordinates[] = {"-26.167004","27.965505"};
        double lat = Double.parseDouble(coordinates[0]);
        double lng = Double.parseDouble(coordinates[1]);
        geoPoint = new GeoPoint((int)(lat*1E6), (int)(lng*1E6));
        mapController.animateTo(geoPoint);
        mapController.setZoom(16);
        mapView.invalidate();

         new MyLocationAsyncTask().execute();

   }



      private class MyLocationAsyncTask extends AsyncTask<Void, Location, Void> implements LocationListener{
        private  double latLocation;
        private Location l;

        //location management variables to track and maintain user location
        protected LocationManager locationManager;
        protected LocationListener locationListener;

        @Override
        protected Void doInBackground(Void... arg0) {
            Looper.prepare();
              locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
              locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 1, locationListener);

              this.publishProgress(l);
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {

            super.onPostExecute(result);
        }

        @Override
        protected void onProgressUpdate(Location... values) {

            super.onProgressUpdate(values);
        }

        //this method is never executed i dont know why...?
        public void onLocationChanged(Location location) {
            if (location != null){
                latLocation = location.getLatitude(); 
                Toast.makeText(getBaseContext(), " Your latLocation :" + latLocation, Toast.LENGTH_LONG).show();
                //Log.d("Your Location", ""+latLocation);
            }
        }

        public void onProviderDisabled(String provider) {


        }

        public void onProviderEnabled(String provider) {
            // TODO Auto-generated method stub

        }

        public void onStatusChanged(String provider, int status, Bundle extras) {
            // TODO Auto-generated method stub

        }


      }


}

Ответы [ 2 ]

2 голосов
/ 25 ноября 2012

Я только что реализовал такие AsyncTask:

class GetPositionTask extends AsyncTask<Void, Void, Location> implements LocationListener
{
    final long TWO_MINUTES = 2*60*1000;
    private Location location;
    private LocationManager lm;

    protected void onPreExecute()
    {
        // Configure location manager - I'm using just the network provider in this example
        lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000, 0, this);
        nearProgress.setVisibility(View.VISIBLE);
    }

    protected Location doInBackground(Void... params)
    {
        // Try to use the last known position
        Location lastLocation = lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);

        // If it's too old, get a new one by location manager
        if (System.currentTimeMillis() - lastLocation.getTime() > TWO_MINUTES)
        {
            while (location == null)
                try { Thread.sleep(100); } catch (Exception ex) {}

            return location;
        }

        return lastLocation;
    }

    protected void onPostExecute(Location location)
    {
        nearProgress.setVisibility(View.GONE);
        lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        lm.removeUpdates(this);

        // HERE USE THE LOCATION
    }

    @Override
    public void onLocationChanged(Location newLocation)
    {
        location = newLocation;
    }

    public void onProviderDisabled(String provider) {}
    public void onProviderEnabled(String provider) {}
    public void onStatusChanged(String provider, int status, Bundle extras) {}
}
1 голос
/ 24 июля 2011

Из того, что я прочитал и попробовал, вы не можете использовать петлитель (который необходим для локализатора) внутри ASyncTask. Нажмите здесь

На самом деле это означает, что две модели потоков не совместимы, поэтому вы не можете использовать их вместе.Looper ожидает владение потоком, с которым вы его связываете, в то время как AsyncTask владеет потоком, который он создает для запуска в фоновом режиме.Таким образом, они конфликтуют друг с другом и не могут использоваться вместе.

Дайан Хэкборн предложила использовать HandlerThread, но мне удалось заставить мой работать внутри IntentService.Я признаю, что мой код все еще немного взломан.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...