Las expresiones Lambda se bloquean con IncompatibleClassChangeError en Android cuando se usa jack
Estoy utilizando Java 8 en mi proyecto de Android. Tengo la configuración de Jack (en el módulo de aplicación de Android) y Retrolambda (en otros módulos).
El problema que tengo es que mis expresiones Lambda se estrellan en un escenario específico cuando trato de hacerlo usar la variable de clase (y puedo reproducirlo en cualquier módulo), en todas las demás situaciones funciona como se esperaba. Tal vez este es un comportamiento estándar de Java, pero no he podido encontrar ninguna explicación hasta ahora. ¿Alguien sabe dónde está el problema? Mi clase y crash abajo:
- Retrolambda: Lint se bloquea al usar expresiones lambda con retrolambda
- Corrija el flujo en RxJava con Retrofit y Realm
- convertir a lambda de rx java expresión
- Android build con retrolambda ignora los cambios de código fuente
- Utilice RxJava y Retrofit para iterar a través de la lista y aumentar los resultados basados en subconsultas
public class LambdaBugTest { private final String parentClassVariableString = "parentClassVariableString"; public void testLambdas() { // ----------- THESE WORK OK -------------- final Functional simpleLambdaWorks = text -> System.out.print(text); final Functional methodReferenceWorks = System.out::print; final Functional interfaceWithClassParamWorks = new Functional() { @Override public void doSomething(String text) { System.out.print(text + " " + parentClassVariableString); } }; // ----------------------------------------- // ----------- THIS ONE CRASHES ------------ final Functional lambdaWithClassParamCrashes = text -> System.out.print(text + " " + parentClassVariableString); // ----------------------------------------- simpleLambdaWorks.doSomething("Text from simpleLambdaWorks"); methodReferenceWorks.doSomething("Text from methodReferenceWorks"); interfaceWithClassParamWorks.doSomething("Text from interfaceWithClassParamWorks"); lambdaWithClassParamCrashes.doSomething("Text from lambdaWithClassParamCrashes"); } private interface Functional { void doSomething(String text); } }
El registro de bloqueo:
08-21 00:27:41.564 25752-25752/debug E/AndroidRuntime: FATAL EXCEPTION: main Process: debug, PID: 25752 java.lang.IncompatibleClassChangeError: The method 'void data.api.mapper.LambdaBugTest.data_api_mapper_LambdaBugTest_lambda$testLambdas$1(java.lang.String)' was expected to be of type direct but instead was found to be of type virtual (declaration of 'java.lang.reflect.ArtMethod' appears in /system/framework/core-libart.jar) at data.api.mapper.LambdaBugTest.access$lambda$1(LambdaBugTest.java) at data.api.mapper.LambdaBugTest$$Lambda$5.doSomething(Unknown) at data.api.mapper.LambdaBugTest.testLambdas(LambdaBugTest.java:27) at home.presentation.HomeActivity.onCreate(HomeActivity.java:47) at android.app.Activity.performCreate(Activity.java:5990) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) at android.app.ActivityThread.access$800(ActivityThread.java:151) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5254) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
- ¿Es una buena práctica utilizar JAVA 8 para el desarrollo de Android?
- Retrolambda Error: No se puede obtener la propiedad 'destinationDir' en un objeto nulo
- Retrolambda en Travis CI
- ¿Instaló la última versión de Android Studio, se produjo la excepción cuando construí el proyecto?
- Error: Error de ejecución para la tarea ': app: compileRetrolambdaLiveDebug
- Android Studio: punto de interrupción en el método estático de la interfaz no funciona
- AndroidHttpClient no encontrado (al ejecutar Robolectric)
- Retrolambda - Jack tiene que soportar java 8 - corrección de advertencia
- ¿Cómo puedo navegar entre páginas dentro de una aplicación PhoneGap?
- ¿Dónde colocar BroadcastReceiver en Android MVP?