David Corsalini
David Corsalini

Reputation: 8208

Android Wear Watchface and the WakeLock

I'm developing a watchface for Android Wear using the WatchFace API (extending CanvasWatchFaceService).

I've used the code from here to build a ticker that run code every second.

I'm experiencing the following problem. Every now and then the service crashes with this exception. I can't understand where it comes from, if you have any lead I'll post additional code.

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)

After this crash the watchface stops working and to make it start again I have to choose another watchface, then reselect mine, so it's a total show stopper!

Upvotes: 1

Views: 1278

Answers (2)

Sterling
Sterling

Reputation: 6635

Props to David for the lead on super. calls - it turns out that was the problem. Specifically, the CanvasWatchFaceService.Engine.onCreate method needs to call through to its ancestor, as such:

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
}

Without the super.onCreate(holder); call, my watch face would crash within minutes; with it, it happily ran overnight.

As an aside, this is something missing from the Android developer documentation; specifically, the Training page for Building a Watch Face Service doesn't include this ancestor call in its code sample.

Upvotes: 4

Piotr Miller
Piotr Miller

Reputation: 311

The code you linked lacks some important parts, that are dotted. I.e. have you defined the update rate?

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

Fully implemented it works well. See AnalogWatchFaceService in code samples: Wearable/Watchface face.

Upvotes: 0

Related Questions