为什么我不能叫wakeLock.release();从处理程序?

时间:2017-07-28 16:00:11

标签: android location handler

我正在尝试为locationListener提供更新时间,因为如果我立即调用quit()方法,它就没有时间更新。为了解决这个问题,我想我会把我的quit方法放在一个处理程序中等待一下。这是我的quit()方法:

private void quit(){
    mSensorManager.unregisterListener(MyService.this);
    wakeLock.release();
    this.stopSelf();
}

此方法的目的是取消注册我的加速计,释放我的wakeLock,然后停止已启动的服务。

这是我的堆栈跟踪:

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
                                                                       at android.os.PowerManager$WakeLock.release(PowerManager.java:2016)
                                                                       at android.os.PowerManager$WakeLock.release(PowerManager.java:1986)
                                                                       at com.example.cnash.raf.MyService.quit(MyService.java:104)
                                                                       at com.example.cnash.raf.MyService.access$000(MyService.java:27)
                                                                       at com.example.cnash.raf.MyService$1.run(MyService.java:92)
                                                                       at android.os.Handler.handleCallback(Handler.java:751)
                                                                       at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                       at android.os.Looper.loop(Looper.java:154)
                                                                       at android.app.ActivityThread.main(ActivityThread.java:6776)
                                                                       at java.lang.reflect.Method.invoke(Native Method)
                                                                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520)
                                                                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)

我见过很多人因为没有获得wakeLock而遇到同样的错误会有麻烦,但我会在onCreate我的服务中找到它,就像这样:

@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();
}

以下是问题所在。我有一个onSensorChanged,我想在那一刻记录加速度计,然后是位置,然后退出。但该位置的更新速度不够快。这是我的onSensorChanged方法:

@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);
}

我想添加数据一秒钟,然后退出。如果我取出处理程序并只调用quit();,那么我的应用程序运行顺利。如果我把它放入处理程序,它会崩溃。为什么呢?

1 个答案:

答案 0 :(得分:0)

请检查您是否未发布两次唤醒锁定。如果在释放之前保持这种检查,则要防止这种检查。

if (wakeLock.isHeld()) {
    wakeLock.release();
}