Note that there are some explanatory texts on larger screens.

plurals
  1. POSending message to a Handler on a dead thread when getting a location from an IntentService
    primarykey
    data
    text
    <p>My app needs location fixes on regular basis, even when the phone is not awake. To do this, I am using IntentService with the pattern generously provided by Commonsware. <a href="https://github.com/commonsguy/cwac-wakeful" rel="nofollow noreferrer">https://github.com/commonsguy/cwac-wakeful</a></p> <p>To get location fixes, I rely on the following code provided by a member called Fedor. <a href="https://stackoverflow.com/questions/3145089/what-is-the-simplest-and-most-robust-way-to-get-the-users-current-location-in-a">What is the simplest and most robust way to get the user&#39;s current location on Android?</a>. I slightly modified it to return null instead of getting the last known location</p> <p>They both work perfectly fine when not combined: I can get a location fix from Fedor's class in an Activity, and I can do some basic stuff ( like logging something) using Commonsware class.</p> <p>The problem occurs when I am trying to get location fixes from the Commonsware's WakefulIntentService subclass. The LocationListeners do not react to locationUpdates and I get these warnings (I don't get yet the subtleties of threads, handlers, ...) . Can someone help me understand what the problem is? Thanks and I wish you all a very happy new year :)</p> <pre><code>12-31 14:09:33.664: W/MessageQueue(3264): Handler (android.location.LocationManager$ListenerTransport$1) {41403330} sending message to a Handler on a dead thread 12-31 14:09:33.664: W/MessageQueue(3264): java.lang.RuntimeException: Handler (android.location.LocationManager$ListenerTransport$1) {41403330} sending message to a Handler on a dead thread 12-31 14:09:33.664: W/MessageQueue(3264): at android.os.MessageQueue.enqueueMessage(MessageQueue.java:196) 12-31 14:09:33.664: W/MessageQueue(3264): at android.os.Handler.sendMessageAtTime(Handler.java:473) 12-31 14:09:33.664: W/MessageQueue(3264): at android.os.Handler.sendMessageDelayed(Handler.java:446) 12-31 14:09:33.664: W/MessageQueue(3264): at android.os.Handler.sendMessage(Handler.java:383) 12-31 14:09:33.664: W/MessageQueue(3264): at android.location.LocationManager$ListenerTransport.onLocationChanged(LocationManager.java:193) 12-31 14:09:33.664: W/MessageQueue(3264): at android.location.ILocationListener$Stub.onTransact(ILocationListener.java:58) 12-31 14:09:33.664: W/MessageQueue(3264): at android.os.Binder.execTransact(Binder.java:338) 12-31 14:09:33.664: W/MessageQueue(3264): at dalvik.system.NativeStart.run(Native Method) </code></pre> <p>This is my WakefulIntentService subclass:</p> <pre><code>public class AppService extends WakefulIntentService { public static final String TAG = "AppService"; public AppService() { super("AppService"); } public LocationResult locationResult = new LocationResult() { @Override public void gotLocation(final Location location) { if (location == null) Log.d(TAG, "location could not be retrieved"); else sendMessage(location); } }; @Override protected void doWakefulWork(Intent intent) { PhoneLocation myLocation; myLocation = new PhoneLocation(); myLocation.getLocation(getApplicationContext(), locationResult); } </code></pre> <p>And here a copy of Fedor's class (slightly modified: no need of GPS nor last known location)</p> <pre><code>public class PhoneLocation { public static String TAG = "MyLocation"; Timer timer1; LocationManager lm; LocationResult locationResult; boolean gps_enabled=false; boolean network_enabled=false; public boolean getLocation(Context context, LocationResult result) { //I use LocationResult callback class to pass location value from MyLocation to user code. locationResult=result; if(lm==null) lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); //exceptions will be thrown if provider is not permitted. try{gps_enabled=lm.isProviderEnabled(LocationManager.GPS_PROVIDER);}catch(Exception ex){} try{network_enabled=lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER);}catch(Exception ex){} //don't start listeners if no provider is enabled if(!gps_enabled &amp;&amp; !network_enabled) return false; if(network_enabled) lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListenerNetwork); timer1=new Timer(); timer1.schedule(new ReturnNullLocation(), 20000); return true; } LocationListener locationListenerNetwork = new LocationListener() { public void onLocationChanged(Location location) { timer1.cancel(); locationResult.gotLocation(location); lm.removeUpdates(this); } public void onProviderDisabled(String provider) {} public void onProviderEnabled(String provider) {} public void onStatusChanged(String provider, int status, Bundle extras) {} }; class ReturnNullLocation extends TimerTask { @Override public void run() { lm.removeUpdates(locationListenerNetwork); locationResult.gotLocation(null); } } public static abstract class LocationResult{ public abstract void gotLocation(Location location); } </code></pre> <p>}</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload