开发者

LocationListener InSide AsyncTask

Hi I am New to android programming and currently developing an application that uses location manager to get user location and place a marker on a map. i am attempting to use AsyncTask to run the LocationListener and Constantly update the marker when the user location has changed. this is the class i am working on...

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 kn开发者_如何学Cow 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

        }


      }


}


I've just implemented such 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) {}
}


From what I have read and tried, you cannot use a looper (which is needed by the locationlistener), inside an ASyncTask. Click Here

Actually it mean the two threading models are not compatible, so you can't use these together. Looper expects to to own the thread that you associate it with, while AsyncTask owns the thread it creates for you to run in the background. They thus conflict with each other, and can't be used together.

Dianne Hackborn suggested using a HandlerThread, but I succeeded in getting mine to work inside of an IntentService. I will admit that my code is still a bit of a hack.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜