android - why can't I call wakeLock.release(); from a handler? -
i trying give locationlistener time update, because doesn't have time update if call quit() method right away. combat thought put quit method in handler wait little bit. here quit() method:
private void quit(){ msensormanager.unregisterlistener(myservice.this); wakelock.release(); this.stopself(); } this methods purpose unregister accelerometer, release wakelock, , stop service has been started.
this stack trace:
07-28 11:50:44.023 25510-25510/com.example.cnash.raf e/androidruntime: fatal exception: main process: com.example.cnash.raf, pid: 25510 java.lang.runtimeexception: wakelock under-locked mywakelock @ android.os.powermanager$wakelock.release(powermanager.java:2016) @ android.os.powermanager$wakelock.release(powermanager.java:1986) @ com.example.cnash.raf.myservice.quit(myservice.java:104) @ com.example.cnash.raf.myservice.access$000(myservice.java:27) @ com.example.cnash.raf.myservice$1.run(myservice.java:92) @ android.os.handler.handlecallback(handler.java:751) @ android.os.handler.dispatchmessage(handler.java:95) @ android.os.looper.loop(looper.java:154) @ android.app.activitythread.main(activitythread.java:6776) @ java.lang.reflect.method.invoke(native method) @ com.android.internal.os.zygoteinit$methodandargscaller.run(zygoteinit.java:1520) @ com.android.internal.os.zygoteinit.main(zygoteinit.java:1410) i have seen many people same error have trouble because don't acquire wakelock, aquire during oncreate of service, so:
@override public void oncreate(){ msensormanager = (sensormanager)getsystemservice(sensor_service); msensor = msensormanager.getdefaultsensor(sensor.type_accelerometer); msensormanager.registerlistener(this, msensor, sensormanager.sensor_delay_normal); powermanager mgr = (powermanager) getapplicationcontext().getsystemservice(context.power_service); wakelock = mgr.newwakelock(powermanager.partial_wake_lock, "mywakelock"); wakelock.acquire(); locationmanager lm = (locationmanager) getsystemservice(context.location_service); try { lm.requestlocationupdates(locationmanager.gps_provider, 1000, .1f, locationlistener); } catch(securityexception | illegalargumentexception e) { e.printstacktrace(); } toast.maketext(this, "oncreate successful", toast.length_short).show(); } below problem is. have onsensorchanged want record accelerometer @ instant, , position, , quit. location isn't getting updated fast enough. here onsensorchanged method:
@override public void onsensorchanged(sensorevent event) { addingstring = serializedatain(); addingstring += '\n' + "x, y, z: " + event.values[0] + ", " + event.values[1] + ", " + event.values[2]; addingstring += '\n' + " " + "longitude, latitude: " + longitude + ", " + latitude; serializedataout(addingstring); mhandler.postdelayed(new runnable() { public void run(){ quit(); } }, 1000); } i want add data 1 second, , quit. if take out handler , call quit(); application runs smoothly. if put handler, crashes. why?
Comments
Post a Comment