簡體   English   中英

Android Wear Watchface和WakeLock

[英]Android Wear Watchface and the WakeLock

我正在使用WatchFace API (擴展CanvasWatchFaceService )為Android Wear開發CanvasWatchFaceService

我使用的代碼從這里構建一個運行代碼的每一秒的股票。

我遇到以下問題。 有時,服務因該異常而崩潰。 我不明白它的來源,如果您有任何潛在客戶,我會發布其他代碼。

01-06 11:22:00.247  12965-12965/com.my.package E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.my.package, PID: 12965
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.os.PowerManager$WakeLock.acquire()' on a null object reference
        at android.support.wearable.watchface.WatchFaceService$Engine.onCommand(WatchFaceService.java:201)
        at android.service.wallpaper.WallpaperService$Engine.doCommand(WallpaperService.java:977)
        at android.service.wallpaper.WallpaperService$IWallpaperEngineWrapper.executeMessage(WallpaperService.java:1191)
        at com.android.internal.os.HandlerCaller$MyHandler.handleMessage(HandlerCaller.java:37)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:135)
        at android.app.ActivityThread.main(ActivityThread.java:5221)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

這次崩潰之后,表盤停止工作,並且要使其重新開始,我必須選擇另一個表盤,然后重新選擇我的表盤,所以這是一個完全的顯示擋塊!

提議戴維(David)領跑super. 電話-事實證明這就是問題所在。 具體來說, CanvasWatchFaceService.Engine.onCreate方法需要調用其祖先,例如:

private class Engine extends CanvasWatchFaceService.Engine {

    @Override
    public void onCreate(SurfaceHolder holder) {
        super.onCreate(holder);
        // your engine initialization code here
    }

    // other watch face engine code
}

沒有super.onCreate(holder); 打電話,我的表盤會在幾分鍾內崩潰; 有了它,它愉快地運行了一整夜。

順便說一句,這是Android開發人員文檔中缺少的內容; 具體來說,用於構建表盤服務的“培訓”頁面在其代碼示例中未包含此祖先調用。

您鏈接的代碼缺少一些重要的部分,這些部分被點綴。 即您是否定義了更新速率?

private static final long INTERACTIVE_UPDATE_RATE_MS = TimeUnit.SECONDS.toMillis(1);

完全實施后效果很好。 請參見代碼示例中的AnalogWatchFaceService:可穿戴/表面。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM