首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Wakelock "DoNotSleep“继续崩溃

Wakelock "DoNotSleep“继续崩溃
EN

Stack Overflow用户
提问于 2014-05-15 09:54:11
回答 1查看 322关注 0票数 0

我最后一个问题:我的应用程序崩溃仅仅是因为唤醒"DoNotSleep“

我添加了一行: wakeLock.acquire();

但我的问题还在继续。:

那是我的逻辑猫:

代码语言:javascript
复制
05-15 12:46:29.316: E/AndroidRuntime(2066): FATAL EXCEPTION: main

05-15 12:46:29.316: E/AndroidRuntime(2066): java.lang.RuntimeException: WakeLock under-locked DoNotSleep

05-15 12:46:29.316: E/AndroidRuntime(2066):     at android.os.PowerManager$WakeLock.release(PowerManager.java:945)

05-15 12:46:29.316: E/AndroidRuntime(2066):     at android.os.PowerManager$WakeLock.release(PowerManager.java:916)

05-15 12:46:29.316: E/AndroidRuntime(2066):     at com.example.iw84u.GpsTracker.UpdateWithNewLocation(GpsTracker.java:190)

05-15 12:46:29.316: E/AndroidRuntime(2066):     at com.example.iw84u.GpsTracker.access$0(GpsTracker.java:169)

05-15 12:46:29.316: E/AndroidRuntime(2066):     at com.example.iw84u.GpsTracker$MyLocationList.onLocationChanged(GpsTracker.java:213)

05-15 12:46:29.316: E/AndroidRuntime(2066):     at android.location.LocationManager$ListenerTransport._handleMessage(LocationManager.java:261)

05-15 12:46:29.316: E/AndroidRuntime(2066):     at android.location.LocationManager$ListenerTransport.access$000(LocationManager.java:189)

05-15 12:46:29.316: E/AndroidRuntime(2066):     at android.location.LocationManager$ListenerTransport$1.handleMessage(LocationManager.java:206)

05-15 12:46:29.316: E/AndroidRuntime(2066):     at android.os.Handler.dispatchMessage(Handler.java:99)

05-15 12:46:29.316: E/AndroidRuntime(2066):     at android.os.Looper.loop(Looper.java:137)

05-15 12:46:29.316: E/AndroidRuntime(2066):     at android.app.ActivityThread.main(ActivityThread.java:5293)

05-15 12:46:29.316: E/AndroidRuntime(2066):     at java.lang.reflect.Method.invokeNative(Native Method)

05-15 12:46:29.316: E/AndroidRuntime(2066):     at java.lang.reflect.Method.invoke(Method.java:511)

05-15 12:46:29.316: E/AndroidRuntime(2066):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)

05-15 12:46:29.316: E/AndroidRuntime(2066):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)

05-15 12:46:29.316: E/AndroidRuntime(2066):     at dalvik.system.NativeStart.main(Native Method)

在我的代码中:

代码语言:javascript
复制
public void onCreate() {
        super.onCreate();
        PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
        wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "DoNotSleep");
        wakeLock.acquire();
}
public void onDestroy() {
    // TODO Auto-generated method stub
    super.onDestroy();



    }
public int onStartCommand(Intent intent, int flags, int startId) {
    // Here there's some calculations with the intent

        return START_REDELIVER_INTENT;

    }
private void UpdateWithNewLocation(final Location loc) {
 wakeLock.release();
//Some commands and then .....
 stopSelf(); 
}

注意:我更改了wakeLock.release();并将其放在函数UpdateWithNewLocation( function )的开头,因为否则它不会停止。

现在我的问题是,我仍然收到错误消息。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-15 10:53:40

如果锁释放的次数比获得的时间多(来源),则会发生此异常:

代码语言:javascript
复制
    public void release()
    {
        synchronized (mToken) {
            if (!mRefCounted || --mCount == 0) {
                try {
                    mService.releaseWakeLock(mToken);
                } catch (RemoteException e) {
                }
                mHeld = false;
            }
            if (mCount < 0) {
                throw new RuntimeException("WakeLock under-locked " + mTag);
            }
        }
    }

您只获得一次锁(在onCreate中),但多次释放它(在UpdateWithNewLocation中)

因此,与其在onCreate()中锁定它并在UpdateWithNewLocation()中发布它,不如在UpdateWithNewLocation()的开头获取它,并在它的末尾发布它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23674852

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档