Android Lambdas

时间:2017-02-07 04:16:07

标签: android lambda

我想在我的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表达式工作得很好(直到他们没有),我认为可以安全地断定这是一个错误。我只是想知道它是否是一个已知的,如果有任何变通方法。

2 个答案:

答案 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,所以我选择从项目中删除所有这些,而不是处理头痛。