2017-07-28 113 views
0

我想給我的位置偵聽器一些時間來更新,因爲它只是沒有時間更新,如果我立即調用我的quit()方法。爲了解決這個問題,我想我只是把我的quit方法放在處理程序中稍微等一下。這裏是我的quit()方法:爲什麼我不能調用wakeLock.release();從處理程序?

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

此方法的目的是註銷我的加速度計,釋放我的喚醒鎖定,然後停止已啓動該服務。

這是我的堆棧跟蹤:

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) 

我見過很多人誰得到同樣的錯誤有麻煩,因爲他們根本不能獲取激活鎖定,但我在我服務的onCreate期間AQUIRE它,像所以:

@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();,然後我的應用程序運行順利。如果我把它放到處理程序中,它會崩潰。爲什麼?

+0

你永遠不應該實現這樣的等待機制。如果它需要超過1000毫秒呢?你爲什麼使用舊的位置api? –

+0

@TimCastelijns我甚至都不知道有更新的位置api。它可以瞬間獲得我的位置,而不必等待對'onLocationChanged'的調用?我的第一個問題讓我有點困惑。爲什麼它需要超過1000毫秒?即使這樣做,我仍然可以,因爲我有一個警報管理器,每10秒會重新啓動一次該服務。 – cjnash

+1

問題是你不知道需要多長時間,所以等待一個固定的秒數是沒有意義的。看看getLastKnownLocation() –

回答

0

請檢查您是否不釋放喚醒鎖兩次。如果在釋放之前進行檢查,則要防止此檢查。

if (wakeLock.isHeld()) { 
    wakeLock.release(); 
} 
相關問題