Skip to content Skip to sidebar Skip to footer

Android: Requestlocationupdates Throws Exception

I'm trying to get periodically the user position via GPS in Android and send the data to a remote DB, but I get the exception: Can't create handler inside thread that has not calle

Solution 1:

The proper way to use the message looper is described in its doc with a code sample here

Solution 2:

Well finally the solution is:

Class LoggingService.java (this is my service):

private void dumpLocationLog() {
        new DumpLocationLog(context, latString, lngString).start();
        Log.d(latString, getClass().getSimpleName());
        Log.d(lngString, getClass().getSimpleName());
        retrieveUserId();
        sendData(user_id);
    }

Then in DumpLocationLog.java:

publicclassDumpLocationLogextendsThread {
    LocationManager lm;
    LocationHelper loc;
    String latString, lngString = null;

    publicDumpLocationLog(Context context, String latString, String lngString) {
        loc = newLocationHelper();
        lm = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
    }

    publicvoidrun() {
        Looper.prepare();
        lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000L, 500.0f, loc);
        Looper.loop();
    }
}

Then finally the LocationHelper for the LocationListener interface:

publicclassLocationHelperimplementsLocationListener {
    publicString latString, lngString;
    publicDouble latitude, longitude;

    @OverridepublicvoidonLocationChanged(Location location) {
        if (location != null) {
            latitude = location.getLatitude();
            longitude = location.getLongitude();
            LocationLoggingService.latString = Double.toString(latitude);
            LocationLoggingService.lngString = Double.toString(longitude);
        }
    }

    @OverridepublicvoidonProviderDisabled(String provider) {
    }

    @OverridepublicvoidonProviderEnabled(String provider) {
    }

    @OverridepublicvoidonStatusChanged(String provider, int status, Bundle extras) {

    }
}

It works like a charm but I have realized, that when listening for locations, it's creating threads non-stop and never closing the former ones; I mean that every time it checks for location, it creates a new thread and after X minutes, there are hundreds of threads.

Anybody knows why?

Solution 3:

What I was suggesting you do was

classDumpLocationLogextendsThread
{
    publicvoidrun()
    {
        LocationManagerlm= (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000L, 500.0f ,/* FIXME this */);
        retrieveUserId();
        sendData(user_id);
    }
}

Then, from wherever you had been calling dumpLocationLog(), use runOnUiThread(new DumpLocationLog()) instead.

Solution 4:

You can use this approach:

class DumpLocationLog extends Thread { public void run() { Looper.prepare(); mLooper = Looper.myLooper(); lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000L, 500.0f ,mLooper); retrieveUserId(); sendData(user_id); Looper.loop(); } public void stop() { mLooper.quit(); } }

Post a Comment for "Android: Requestlocationupdates Throws Exception"