java - 方法参考需要 API 级别 22
问题描述
基于Use Java 8 language features方法引用与任何 minSdkVersion兼容,那么为什么方法引用需要 API 级别 22?
目前,我正在使用带有com.android.tools.build:gradle:3.2.1
JDK 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));
}
解决方案
我不知道你在调用什么方法,但这里有两个不同的东西。
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
}
推荐阅读
- r - 如何将不同的变量循环到同一个命令
- bash - 替换 Docker 图像标签
- excel - INT 在 Apache POI 中不起作用
- tfs - 什么决定了 Azure Devops 待办事项中显示的内容?
- python - dask.array.apply_along_axis:使用 dask.array 的每一行作为另一个函数的输入由于附加元素([1])而失败
- r - R中融化数据框的热图可视化问题
- c# - 我怎样才能迭代这个循环3次然后退出它然后将内容统一保存到一个wav文件中
- glut - 关闭 pyopengl 窗口时应用程序完全关闭
- javascript - 元素在 javascript 中通过其 id 作为变量引用?
- css - 如何使用 CSS 制作新拟态风格的元素阴影?