Android Lambdas的NoSuchMethodError

Ice*_*nte 5 lambda android

我正在寻求在我的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.我只是想知道它是否是一个已知的,如果它有任何变通方法.

Ice*_*nte 2

Parth 的回答很有帮助,但最终无论我做什么,我都会在使用 lambda 表达式时遇到运行时错误。由于基于 Intellij 的 IDE 在视觉上将单函数接口的实现表示为 lambda,因此我选择从项目中删除所有这些接口,而不是处理这个令人头痛的问题。

  • 我有同样的问题。我时不时地随机出现 NoSuchMethodError 。项目清理修复了该问题一段时间。Android 问题跟踪器中已报告此问题:https://issuetracker.google.com/issues/37563269 (2认同)