【问题标题】:NoSuchMethodError with Android LambdasAndroid Lambda 的 NoSuchMethodError
【发布时间】: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 表达式工作得很好(直到它们不能工作),所以我认为可以安全地得出结论,这是一个错误。我只是想知道它是否是已知的,是否有任何解决方法。

【问题讨论】:

标签: android lambda


【解决方案1】:

在您的 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
  }
}

【讨论】:

  • 谢谢-在进行清理和重新部署后,我对您的回答的最初实施没有奏效。我不得不关闭模拟器并重试,但现在看起来很棒。
  • 抱歉 - 在重新审视这个问题之后,jackOptions 并没有改变游戏规则。我将编辑我的原始问题以提供更多详细信息。
【解决方案2】:

Parth 的回答很有帮助,但最后无论我做什么,我都会使用 lambda 表达式不断收到运行时错误。因为基于 Intellij 的 IDE 将单个函数接口的实现可视化地表示为 lambda,所以我选择从我的项目中删除所有这些接口,而不是解决这个令人头疼的问题。

【讨论】:

  • 我也有同样的问题。我不时随机出现 NoSuchMethodError。项目清理解决了一段时间的问题。这已在 Android 问题跟踪器中报告:issuetracker.google.com/issues/37563269
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-20
  • 2015-08-22
  • 1970-01-01
  • 1970-01-01
  • 2016-03-06
  • 2018-09-23
  • 2020-08-17
相关资源
最近更新 更多