首页 > 解决方案 > 方法参考需要 API 级别 22

问题描述

基于Use Java 8 language features方法引用与任何 minSdkVersion兼容,那么为什么方法引用需要 API 级别 22

目前,我正在使用带有com.android.tools.build:gradle:3.2.1JDK 1.8 的 Android Studio 3.2.1,在build-gradle 中我有:

android {
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

例子

public class SimpleBundleEntry<V> extends BundleEntry<V> {

    public SimpleBundleEntry(String key, V value, 
                            BundleWriter<V> writer, BundleReader<V> reader) 
    {/*init*/}

    // ...

    public interface BundleReader<V> {
        V readValue(Bundle bundle, String key);
    }

    public interface BundleWriter<V> {
        void writeValue(Bundle bundle, String key, V value);
    }
}

有问题的代码

public static BundleEntry<Boolean> ofBoolean(String key, Boolean value) {
    return new SimpleBundleEntry<>(key, value,
            Bundle::putBoolean, // <------------------- PROBLEM HERE
            (bundle, k) -> bundle.getBoolean(k));
}

标签: javaandroidjava-8

解决方案


我不知道你在调用什么方法,但这里有两个不同的东西。

Android 是基于 java 构建的,这意味着您在手机上安装了 java 版本来运行操作系统。

随着 java 获得更新,一些方法被添加到框架中,因此 1.8 中存在的方法在 1.7 中不存在

但Android也是一个获取更新的平台,此时我们是第28个版本(https://developer.android.com/studio/releases/platforms)。

此版本中的每一个都有一组新的方法,这些方法在前一个版本中不存在。

因此,如果您正在调用 Android 22 中引入的方法并且您在 API 16 手机上运行应用程序,这将导致崩溃。

为防止这种情况,您必须将需要 Android API 22 的代码通过

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {
   // call the method that needs API 22 at least
} else {
   // do something backward compatible
}

推荐阅读