基于Use Java 8 language features的方法引用与任何minSdkVersion 兼容,那么为什么方法引用需要API级别22 ?
当前,我在{em> build-gradle 中使用带有/**
和JDK 1.8的Android Studio 3.2.1,
com.android.tools.build:gradle:3.2.1
示例
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);
}
}
答案 0 :(得分:2)
我不知道您正在调用什么方法,但是这里有两件事。
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
}
答案 1 :(得分:0)
Java 8支持的语言功能
在撰写本文时,对Java 8语言的Android支持尚未完成。但是,所有主要功能均受支持,其中某些功能(例如lambda表达式)也已反向移植到API级别23和更低的级别。
以下是受支持功能的列表:
Lambda表达式(也用于API <= 23)
方法参考(也适用于API <= 23)
类型注释(也用于API <= 23)
默认和静态接口方法
可重复的批注
除了列出的以外,值得一提的是,还支持Stream API以及其他一些功能(有关完整列表,请参阅官方文档)。
环绕需要API 22或字母的代码
//if(Build.VERSION.SDK_INT >= 22)
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP_MR1) {
//code...
} else {
//code.....
}