Android 事物上的 IncompatibleClassChangeError

IncompatibleClassChangeError on Android Things

更新到最新的 Android Things 预览后,我的应用崩溃了 通过按钮 GPIO 设置回调。我定义了以下按钮回调:

private class ButtonCallback extends GpioCallback {
    @Override
    public boolean onGpioEdge(Gpio gpio) {
        boolean isPressed = false;
        try {
            isPressed = gpio.getValue();
        } catch (IOException e) {
            Log.w(TAG, "Error", e);
        }

        if (isPressed) {
            ...
        }
        return true;
    }
}

我在应用程序中用GPIO注册如下:

Gpio button = ...;
try {
    button.registerGpioCallback(new ButtonCallback());
} catch (IOException e) {
    Log.w(TAG, "Error configuring GPIO pins", e);
}

当我 运行 我的应用程序时,我得到一个 IncompatibleClassChangeError 并且应用程序崩溃:

java.lang.IncompatibleClassChangeError: Superclass com.google.android.things.pio.GpioCallback of com.google.android.things.example.MainActivity$ButtonCallback is an interface (...)

此代码之前可以正常工作,为什么更新后开始出现这种情况?

从预览版 7 开始,许多外设 I/O 接口都是从 抽象 类 到接口。这样做是为了更好地促进可测试性 在应用程序中,因为界面更容易模拟。

请务必更新您的应用以使用 Preview 7 SDK:

dependencies {
    compileOnly 'com.google.android.things:androidthings:0.7-devpreview'
}

然后修改回调以实现接口:

private class ButtonCallback implements GpioCallback {
    @Override
    public boolean onGpioEdge(Gpio gpio) {
        boolean isPressed = false;
        try {
            isPressed = gpio.getValue();
        } catch (IOException e) {
            Log.w(TAG, "Error", e);
        }

        if (isPressed) {
            ...
        }
        return true;
    }
}

回顾 Android 事情 API reference 验证您调用的任何其他 API 是否已更改。