2016-07-27 37 views
14

mogę używać retrolambda włączyć lambdy z poziomu Android API < 24. Tak to działaCzy istnieje sposób korzystania z funkcjonalnych interfejsów Java 8 w Androidzie API poniżej 24?

myButton.setOnClickListener(view -> Timber.d("Lambdas work!")); 

Działa to również

Runnable runLater =() -> Timber.d("Lambdas work!"); 
runLater.run(); 

Ale to nie

Consumer<Integer> runLaterWithInt = (Integer i) -> Timber.d("i = " + i); 
runLaterWithInt.accept(3); 

ostatnia działa na Androidzie 24 poziom interfejsu API, ale na innych urządzeniach kod ten powoduje awarię

java.lang.NoClassDefFoundError: com.retrolambdatry.MainActivity$$Lambda$1 

Zamiast używać retrolambdy, próbowałem włączyć Java 8. Pierwsze dwa przykłady kodu nadal działają, mimo że nożyk przestał działać. https://developer.android.com/preview/j8-jack.html#configuration tutaj ava.util.function mówi się być obsługiwane, ale wciąż otrzymuję błąd podczas uruchamiania trzeci, tym razem jest to trochę inaczej

java.lang.NoClassDefFoundError: com.retrolambdatry.MainActivity$-void_onCreate_android_os_Bundle_savedInstanceState_LambdaImpl1 
+1

Prawdopodobny duplikat [Czy Java 8 działa na api Android 23 i wyższych?] (Http://stackoverflow.com/questions/35934528/does-java-8-work-on-android-api-23-and- powyżej) –

+2

Pytanie jest słabo zatytułowane; lambda jest w rzeczywistości przenoszona do starszych wersji Androida, więc nie potrzebujesz Retrolambdy. Po prostu zainstaluj nowe Android Studio i twórz narzędzia. –

+1

Być może jest to słabo zatytułowane. Jak rozumiem, nie potrzebuję retorlambda, jeśli mam Androida N SDK i włączam opcje kompilacji Jack. Lambda działa tak czy inaczej. Ale funkcjonalne interfejsy z 'java.util.function' nadal nie działają. – sasha199568

Odpowiedz

7

Nie wiem, czy trzeba jeszcze odpowiedzieć na to pytanie, ale inni (jak ja) może.

Jako wersja 3.0, Android Studio natively supports lambda functions i wiele innych funkcji Java 8 na wszystkich poziomach interfejsu API, ale niektóre (takie jak interfejsy funkcjonalne i java.util.function) są nadal ograniczone do interfejsów API 24+.

Do czasu rozszerzenia tej obsługi android-retrostreams zapewnia wsparcie dla wielu portów. Ten projekt jest "ulepszonym portem" urządzenia streamsupport library, z którego można również korzystać i ma wiele funkcjonalności w retrostreamach z Androidem. Biblioteka strumieni obsługuje do wersji Java 6/7, więc można z niej korzystać nawet wtedy, gdy nie masz wersji 3.0 lub nowszej lub nie korzystasz z Javy 8, ale w większości przypadków lepiej jest użyć retrostreamów z Androidem, jeśli możesz. Możesz przejść przez javadocs projektu, aby zobaczyć dokładnie to, co jest oferowane, ale podkreślam, że użyłem go: java.util.function i java.util.Comparator.

Należy pamiętać, że java w nazwach pakietów zastąpiono java9, a niektóre nazwy klas i/lub metod mogły zostać nieco zmienione.Np

java.util.function się java9.util.function,

podczas

java.util.Comparator się java9.util.Comparators (i nieco inna metoda nazwy i wzory połączenia - lecz z takimi samymi funkcjami).

+3

Korekta: [android-retrostreams] (https://github.com/retrostreams/android-retrostreams) * nie * działa na Java 7, jeśli masz na myśli maszynę wirtualną Java 7 Oracle/OpenJDK. * Działa * na urządzeniach z Androidem do poziomu API 15 lub 14, niezależnie od wersji Java, która była wtedy aktualna, * pod warunkiem * używasz Androida Studio 3.x i jego możliwości w języku Java 8 do tworzenia aplikacji dla takich urządzeń (nie działa z Androidem Studio 2.3.x). Jeśli potrzebujesz funkcji API Stream API, która rzeczywiście * działa * na rzeczywistej maszynie wirtualnej Java 6/7 (Sun itd.), Musisz użyć [streamsupport] (https://sourceforge.net/projects/streamsupport/). – Sartorius

+0

Ach, mój zły. Readme "android-retrostreams" sprawiło, że brzmiało to tak, jakby zrzuciło tylko obsługę Java 6, i że będzie działało dla Android Studio, nawet jeśli nie celowałeś jawnie w Java 8. I tak naprawdę nigdy tego nie wypróbowałem. Będę edytować w celu wyjaśnienia, na wszelki wypadek. – VerumCH

+0

Jak to ma znaczenie, która wersja Java jest kierowana na system Android Studio 3.x? Ostatecznie to * minSDKVersion * decyduje o tym, czy aplikacja działa, powiedzmy Marshmallow. Tak więc, aby uniknąć możliwego zamieszania: pozwól, * minSDKVersion = 23 * (Marshmallow), następnie "celuj" w Javę 8 w Android Studio 3.x i używaj 'android-retrostreams', a wszystko będzie dobrze. Mówię tylko, że plik 'android-retrostreams ** ** jar ** nie może być uruchomiony na maszynie wirtualnej Java 7 Standard Edition (JRE firmy Oracle, IBM ...) – Sartorius

-1

Java 8 interfejsy funkcjonalne mogą być włączone do uruchomienia na wcześniejszych wersjach Androidem włączanie zestawu narzędzi Toolchaina. Można to zrobić przez dodanie następujących linijek kodu do pliku build.gradle:

android{ 
... 
    defaultConfig{ 
    ... 
    jackOptions.enabled = true 
    } 
    compileOptions{ 
    sourceCompatibility JavaVersion.VERSION_1_8 
    targetCompatibility JavaVersion.VERSION_1_8 
    } 
} 

Jednak trzeba pamiętać, że trzeba wyłączyć natychmiastowy bieg, ponieważ wciąż nie może pracować z Java 8.

Możesz również dowiedzieć się więcej informacji z tego filmu wideo z programistów Androida kanale: https://www.youtube.com/watch?v=zfLKMun94Yc&index=10&list=PLWz5rJ2EKKc9tH0dRV1_HmQBXe_-qFQPl

Daj mi znać jak poszło.

+3

Oczywiście, działa to w ten sposób. Jednak, aby uniknąć nieporozumień, należy wspomnieć, że funkcjonalne interfejsy z pakietu 'java.util.function' nadal nie będą dostępne. – Sartorius

+0

Android obsługuje lambdę, nawet jeśli API jest niższy niż iOS, jednak nie działa to dla interfejsu funkcjonalnego – York

+0

Zespół narzędzi Jack jest teraz [przestarzały] (https://developer.android.com/studio/preview/features/java8-support .html) – nyconing

0
allprojects { 
    repositories { 
     maven { url 'https://jitpack.io' } 
    } 
} 
dependencies { 
     compile 'com.github.ipcjs:java-support:0.0.3' 
} 

Kod: ipcjs/java-support

+2

co to jest i dlaczego to pomaga? – lucidbrot

+0

@lucidbrot, aby zobaczyć README.md w [the resp] (https://github.com/ipcjs/java-support) – ipcjs

+1

@jpcjs yeah Już na to patrzyłem, ale to niewiele z dokumentacji. Moje pytanie pozostaje^^ co to jest? tylko kompletna kopia Androida? i dlaczego to działa? – lucidbrot