2017-02-07 8 views
5

Я ищу использовать Лямбда-выражения в моем проекте Android (мин. Sdk: 16, target sdk: 25), но сталкиваются со многими проблемами.NoSuchMethodError с Android Lambdas

Первой проблемой является то, что я разрабатываю и отлаживаю свое приложение с помощью эмулятора, развертывая и исправляя ошибки несколько раз, когда, из-за синего, приложение полностью перестанет загружаться.

я получаю следующую трассировку стека в моем журнале:

java.lang.NoSuchMethodError: No direct method (Ljava/lang/Object;)V in class Lcom/androidtest/-$Lambda$1; or its super classes (declaration of 'com.androidtest.-$Lambda$1' appears in /data/app/com.androidtest-2/base.apk)

Я позволил использовать лямбда-выражения, как описано в документации андроида со следующим кодом в моем приложении файл/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 и добавил в jackOptions параметр Я мой файл build.gradle и считаю, что для решения этой проблемы, но после восстановления моего проекта я теперь sproadically получить другую ошибку:

java.lang.IncompatibleClassChangeError: Class 'com.gfs.jotsalot.-$Lambda$1' does not implement interface 'java.lang.Runnable' in call to 'void java.lang.Runnable.run()' (declaration of 'android.os.Handler' appears in /system/framework/framework.jar) at android.os.Handler.handleCallback(Handler.java:751) at android.os.Handler.dispatchMessage(Handler.java:95)

Замена лямбда-выражения, как представляется, решить эту проблему, так происходит из

() -> { Log.i(TAG, "Hey There"); }

в

new Runnable() { 
    @Override 
    public void run() { 
     Log.i(TAG, "Hey There"); 
    } 
} 

работ. Я делаю это в потоковом приложении, поэтому я не уверен, если это причина ошибки, и до сих пор я только пробовал ее на эмуляторе. Реконструкция проекта устраняет проблему, но это очень трудоемко, и хлопот вреден для того, чтобы удалить все из моего проекта.

До сих пор я тестировал только внутри эмулятора и не уверен, повлияет ли он на подлинную телефонную среду. Поскольку эти лямбда-выражения работают очень хорошо (пока они этого не сделают), я думаю, можно с уверенностью заключить, что это ошибка. Мне просто интересно, известно ли это, и если есть какие-то обходные пути.

+1

Посмотрите здесь: http://stackoverflow.com/questions/41552073/no-virtual-method-com-polidea-rxandroidble-internal-radio-rxbleradioimpllambda – paulsm4

ответ

2

ответ Parth был полезным, но в конце концов я продолжал получать ошибки во время выполнения не используя лямбда-выражения, независимо от того, что я seemd делать. Поскольку IDE на основе Intellij представляет визуализации реализаций интерфейсов с одной функциональностью как ящеры, я решил просто удалить их все из моего проекта, а не заниматься головной болью.

+2

У меня такая же проблема. Я случайно получаю NoSuchMethodError время от времени. Очистка проекта исправляет проблему в течение некоторого времени. Об этом сообщается в отслеживателе проблем для Android: https://issuetracker.google.com/issues/37563269 – Ika

3

В вашем файле build.gradle вы отсутствуете jackOptions enabled to true, просто добавьте это в свой 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 
    } 
} 
+0

Спасибо, что моя первоначальная реализация вашего ответа не работала после делая чистый и передислоцировать. Мне пришлось закрыть эмулятор и попробовать еще раз, но теперь он выглядит великолепно. – IcedDante

+0

Рад, что это сработало для вас @IcedDante –

+0

К сожалению, после повторной этой проблемы jackOptions не был игровым чейнджером. Я отредактирую свой оригинальный вопрос, чтобы предоставить более подробную информацию. – IcedDante

Смежные вопросы