我想在我的Android项目中使用 Lambda表达式(min sdk:16,target sdk:25),但遇到了很多问题。
第一个问题是我正在使用模拟器开发和调试我的应用程序,多次部署和修复错误,当突然显示应用程序将完全停止加载时。
我在日志中得到以下堆栈跟踪:
java.lang.NoSuchMethodError:没有直接的方法 (Ljava / lang / Object;)类Lcom / androidtest /中的V - $ Lambda $ 1;要么 它的超级课程(宣布' com.androidtest .- $ Lambda $ 1'出现 在/data/app/com.androidtest-2/base.apk)
我已经启用了如android文档中所述的lambda表达式,并在我的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:Class ' com.gfs.jotsalot .- $ LAMBDA $ 1#39;没有实现接口 '了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表达式工作得很好(直到他们没有),我认为可以安全地断定这是一个错误。我只是想知道它是否是一个已知的,如果有任何变通方法。
答案 0 :(得分:3)
在您的build.gradle
文件中,您缺少启用了true的jackOptions,只需将其添加到您的defaultConfig
,如下所示,我认为它应该有效。
android {
defaultConfig {
applicationId "com.gfs.mp3lab"
minSdkVersion 16
targetSdkVersion 25
jackOptions {
enabled true
}
...
}
...
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
答案 1 :(得分:2)
Parth的回答很有帮助,但最后我不得不使用lambda表达式来获取运行时错误,无论我做什么。因为基于Intellij的IDE在视觉上将单个函数接口的实现表示为lambdas,所以我选择从项目中删除所有这些,而不是处理头痛。