【发布时间】:2017-04-21 22:34:10
【问题描述】:
我正在寻求在我的 Android 项目中使用 Lambda 表达式(最小 sdk:16,目标 sdk:25),但遇到了很多问题。
第一个问题是我正在使用模拟器开发和调试我的应用程序,多次部署和修复错误,但突然之间,应用程序将完全停止加载。
我在我的日志中得到以下堆栈跟踪:
java.lang.NoSuchMethodError: 没有直接方法 (Ljava/lang/Object;)V 在类 Lcom/androidtest/-$Lambda$1;或者 它的超类(“com.androidtest.-$Lambda$1”的声明出现 在/data/app/com.androidtest-2/base.apk)
我已经启用了 lambda 表达式的使用,如 android 文档中所述,在我的 app/build.gradle 文件中使用以下代码:
android {
compileSdkVersion 25
buildToolsVersion "25.0.2"
defaultConfig {
applicationId "com.gfs.mp3lab"
minSdkVersion 16
targetSdkVersion 25
...
}
...
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
我接受了 Parth Pandya 的建议,并在我的 build.gradle 文件中添加了 jackOptions 参数,并认为可以解决问题,但是在重建我的项目后,我现在广泛地得到一个不同的错误:
java.lang.IncompatibleClassChangeError: 类 'com.gfs.jotsalot.-$Lambda$1' 没有实现接口 'java.lang.Runnable' 在调用'void java.lang.Runnable.run()' (“android.os.Handler”的声明出现在 /system/framework/framework.jar) 在 android.os.Handler.handleCallback(Handler.java:751) 在 android.os.Handler.dispatchMessage(Handler.java:95)
替换 lambda 表达式似乎可以解决问题,所以从
() -> { Log.i(TAG, "Hey There"); }
到
new Runnable() {
@Override
public void run() {
Log.i(TAG, "Hey There");
}
}
有效。我在线程应用程序中执行此操作,所以我不确定这是否是错误的原因,到目前为止我只在模拟器上尝试过。重建项目解决了这个问题,但这非常耗时,而且这种麻烦对我从项目中删除所有这些都是有害的。
到目前为止,我只在模拟器内部进行了测试,不确定它是否会影响真正的手机环境。因为这些 lambda 表达式工作得很好(直到它们不能工作),所以我认为可以安全地得出结论,这是一个错误。我只是想知道它是否是已知的,是否有任何解决方法。
【问题讨论】: