我正在寻求在我的Android项目中使用Lambda表达式(min sdk:16,target sdk:25),但遇到了很多问题.
第一个问题是我正在使用模拟器开发和调试我的应用程序,多次部署和修复错误,当突然显示应用程序将完全停止加载时.
我在日志中得到以下stacktrace:
java.lang.NoSuchMethodError:没有直接方法(Ljava/lang/Object;)类Lcom/androidtest/ - $ Lambda $ 1; 或其超级类('com.androidtest .- $ Lambda $ 1'的声明出现在/data/app/com.androidtest-2/base.apk中)
我在我的app/build.gradle文件中使用以下代码启用了android文档中描述的lambda表达式:
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
}
}
Run Code Online (Sandbox Code Playgroud)
我接受了Parth Pandya的建议,并在我的build.gradle文件中添加了jackOptions参数,并认为可以解决问题,但在重建我的项目之后,我现在在公平地得到一个不同的错误:
java.lang.IncompatibleClassChangeError:Class'com.gfs.jotsalot .- $ Lambda $ 1'在调用'void java.lang.Runnable.run()'时没有实现接口'java.lang.Runnable'('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");
}
}
Run Code Online (Sandbox Code Playgroud)
作品.我在一个线程应用程序中这样做,所以我不确定这是否是错误的原因,到目前为止我只在模拟器上尝试过.重建项目可以解决问题,但这非常耗费时间,而且麻烦对于我从项目中删除所有这些内容一直是有害的.
到目前为止,我只在模拟器内部进行了测试,并且不确定它是否会影响真正的手机环境.因为这些lambda表达式工作正常(直到它们没有),我认为可以安全地断定这是一个bug.我只是想知道它是否是一个已知的,如果它有任何变通方法.
Parth 的回答很有帮助,但最终无论我做什么,我都会在使用 lambda 表达式时遇到运行时错误。由于基于 Intellij 的 IDE 在视觉上将单函数接口的实现表示为 lambda,因此我选择从项目中删除所有这些接口,而不是处理这个令人头痛的问题。
归档时间: |
|
查看次数: |
844 次 |
最近记录: |