标签: retrolambda

android retrolambda,语句lambda可以用表达式lambda替换

我在我的项目中使用了retrolambda,效果很好.但是今天当我使用它时,Android Studio会给我一个提示:

在此输入图像描述

我以前没见过,我需要修改代码才能满足这个提示.

lambda android android-studio retrolambda

9
推荐指数
1
解决办法
3675
查看次数

Maven:在装有retrolambda-maven-plugin的应用程序和使用android-maven-plugin的DEX-ed中使用Java 8库

我已经为我的内部使用写了一小组minilibraries.这是使用Maven构建的.这些库的目标是"常规"Java,GWT和Android.其中一些是用Java 8编写的,因为我没有打算在GWT或Android上运行它们,因此其他库是用旧的Java 6编写的,以支持这两个库.我有一个将我的libs完全迁移到Java 8的计划(在语言特性方面),我成功地在尚未发布的GWT 2.8.0上运行Java 8重写库.但是,我不能让Java 8重写的libs为Android应用程序编译.问题是,Retrolambda(retrolambda-maven-plugin插件)似乎只能处理当前的Maven模块类,并完全忽略依赖类.因此,android-maven-plugin打破目标应用程序构建:

[INFO] UNEXPECTED TOP-LEVEL EXCEPTION:
[INFO] com.android.dx.cf.iface.ParseException: bad class file magic (cafebabe) or version (0034.0000)
[INFO]  at com.android.dx.cf.direct.DirectClassFile.parse0(DirectClassFile.java:472)
[INFO]  at com.android.dx.cf.direct.DirectClassFile.parse(DirectClassFile.java:406)
[INFO]  at com.android.dx.cf.direct.DirectClassFile.parseToInterfacesIfNecessary(DirectClassFile.java:388)
[INFO]  at com.android.dx.cf.direct.DirectClassFile.getMagic(DirectClassFile.java:251)
[INFO]  at com.android.dx.command.dexer.Main.processClass(Main.java:665)
[INFO]  at com.android.dx.command.dexer.Main.processFileBytes(Main.java:634)
[INFO]  at com.android.dx.command.dexer.Main.access$600(Main.java:78)
[INFO]  at com.android.dx.command.dexer.Main$1.processFileBytes(Main.java:572)
[INFO]  at com.android.dx.cf.direct.ClassPathOpener.processArchive(ClassPathOpener.java:284)
[INFO]  at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:166)
[INFO]  at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:144)
[INFO]  at com.android.dx.command.dexer.Main.processOne(Main.java:596)
[INFO]  at com.android.dx.command.dexer.Main.processAllFiles(Main.java:498)
[INFO]  at com.android.dx.command.dexer.Main.runMonoDex(Main.java:264)
[INFO]  at com.android.dx.command.dexer.Main.run(Main.java:230)
[INFO]  at com.android.dx.command.dexer.Main.main(Main.java:199)
[INFO]  at com.android.dx.command.Main.main(Main.java:103)
[INFO] ...while parsing foo/bar/FooBar.class …
Run Code Online (Sandbox Code Playgroud)

android maven java-8 android-maven-plugin retrolambda

8
推荐指数
1
解决办法
1578
查看次数

Maven/Retrolambda:如何检测Java 8类的依赖关系

背景:

我们有maven基于Java的项目,它以JRE 1.7为目标,但源代码使用lambdas,因此我们用它retrolambda来转换Java 8源代码Java 7.当我们需要stream,function.*,Optional等时,我们也使用StreamSupport backport库.

用法retrolambda包括将项目的源语言和目标语言级别配置为1.8.

如果对java8类或方法(比如不依赖一切工作正常java.util.stream.*,java.util.Optional或方法引入java8类似Collection.forEach).如果有这样的用法然后构建传递,但它在运行时失败,当在Java 8的JVM下运行时.

题:

我的目标是在存在此类依赖项的情况下使构建失败.有没有办法Java 8在构建时检测新类/方法的依赖?

我想到了两个可能的选择,但我不确定它们中的任何一个是否可行:

  1. 某种字节码分析器,用于检测预定义类和方法的依赖性.有这样的工具/ maven插件吗?
  2. Lint(lint4j)规则.不确定是否可以使用检测对类/方法的依赖性lint

java lint maven java-8 retrolambda

8
推荐指数
1
解决办法
588
查看次数

RxJava中的方法引用如何工作?

有人可以解释一下,为什么这两个 lambda都可以用这里的方法引用替换?

在RxJava中,map()接受一个类型的参数Func1<T, R>,其注释声明它"表示具有一个参数的函数".因此我完全理解为什么valueOf(Object)在这里工作.但trim()需要任何参数都没有.

那么这是如何工作的呢?

Observable.just("")
    .map(s -> String.valueOf(s))  //lambdas
    .map(s -> s.trim())           //

    .map(String::valueOf)         //method references
    .map(String::trim)            //
    .subscribe();
Run Code Online (Sandbox Code Playgroud)

java lambda rx-java retrolambda

6
推荐指数
1
解决办法
787
查看次数

Android Studio:静态方法接口中的断点不起作用

Android Studio不会在接口的静态方法中停止.

示例:请参阅项目Conductor(version )的Utils.javagetFilteredNotes接口中的方法:0.9.3

public interface Utils {
    // some lines removed for readability

    static List<Note> getFilteredNotes(AppState appState) {
        List<Note> notes = appState.notes();
        NotesFilter filter = appState.filter();
        return filter(ConsPStack.from(notes), note ->
                filter == NotesFilter.ALL
                        || filter == NotesFilter.CHECKED && note.checked
                        || filter == NotesFilter.UNCHECKED && !note.checked);
    }
Run Code Online (Sandbox Code Playgroud)

当我将接口转换为类时,它工作:

public class Utils 
Run Code Online (Sandbox Code Playgroud)

为什么断点不能在界面上工作?

更多细节:

  • Android Studio版本 2.2.2
  • 虚拟设备: Nexus_6_API_25.avd
    • 安卓: 7.1.1
    • 中央处理器: x86
  • minifyEnabled=false调试版本的设置没有帮助
  • 该项目正在使用retrolambda

java android breakpoints android-studio retrolambda

6
推荐指数
0
解决办法
453
查看次数

编译时的java.lang.NoSuchMethodError

我正在尝试编译Android项目失败.错误消息是:

任务':mobile:_compileAppDebug'的执行失败.

java.lang.NoSuchMethodError:com.google.auto.common.MoreTypes.asTypeElements(Ljavax/lang/model/util/Types; Ljava/lang/Iterable;)Lcom/google/common/collect/ImmutableSet;

这是我的模块的gradle依赖项,其中我指定了许多库,包括google Auto:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile project(':library')
    compile 'com.google.dagger:dagger:2.0-SNAPSHOT'
    provided 'com.google.auto.value:auto-value:1.0-rc1'
    apt 'com.google.dagger:dagger-compiler:2.0-SNAPSHOT'
    provided 'org.glassfish:javax.annotation:10.0-b28' 
    compile 'com.jakewharton:butterknife:6.1.0' 
    compile 'com.f2prateek.dart:dart:1.1.0'
}
Run Code Online (Sandbox Code Playgroud)

当我查看依赖项时,我认为我只需要谷歌自动值,因为这是丢失方法所在的位置,但添加提供的并不能解决问题.

项目gradle文件包含retrolambda插件

dependencies {
    classpath 'me.tatarka:gradle-retrolambda:2.5.0'
    classpath 'com.android.tools.build:gradle:1.0.1'
    classpath 'com.jakewharton.sdkmanager:gradle-plugin:0.12.+'
    classpath 'io.fabric.tools:gradle:1.+'
    classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4'
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮我确定哪些依赖项导致编译错误?有趣的是,当我将gradle文件复制到一个空项目时,一切运行正常.

java android butterknife dagger-2 retrolambda

5
推荐指数
1
解决办法
1327
查看次数

特拉维斯CI的Retrolambda

我的travis.yml文件:

language: android

jdk: oraclejdk8

android:
  components:
    - build-tools-22.0.1
    - android-22
    - extra-android-m2repository

script:
    - gradle build connectedCheck
Run Code Online (Sandbox Code Playgroud)

app:compileRetrolambdaDebug错误消息期间失败Process 'command '/usr/lib/jvm/java-8-oracle/bin/java'' finished with non-zero exit value 1.

可以在Travis CI上运行Retrolambda吗?

添加--debug参数后,我得到以下信息:

13:44:02.064 [INFO] [system.out] Error! Failed to transform some classes
13:44:02.073 [INFO] [system.out] java.lang.RuntimeException: java.lang.IllegalAccessException: no such method: cz.skaut.warehousemanager.fragment.ItemDetailFragment.lambda$onViewCreated$32(Bitmap)void/invokeSpecial
at net.orfjackal.retrolambda.lambdas.LambdaReifier.reifyLambdaClass(LambdaReifier.java:42)
at net.orfjackal.retrolambda.lambdas.BackportLambdaInvocations$InvokeDynamicInsnConverter.backportLambda(BackportLambdaInvocations.java:105)
at net.orfjackal.retrolambda.lambdas.BackportLambdaInvocations$InvokeDynamicInsnConverter.visitInvokeDynamicInsn(BackportLambdaInvocations.java:94)
at net.orfjackal.retrolambda.asm.ClassReader.readCode(ClassReader.java:1439)
at net.orfjackal.retrolambda.asm.ClassReader.readMethod(ClassReader.java:1017)
at net.orfjackal.retrolambda.asm.ClassReader.accept(ClassReader.java:693)
at net.orfjackal.retrolambda.asm.ClassReader.accept(ClassReader.java:506)
at net.orfjackal.retrolambda.Transformers.lambda$transform$4(Transformers.java:106)
at net.orfjackal.retrolambda.Transformers$$Lambda$2/1190900417.accept(Unknown Source)
at net.orfjackal.retrolambda.Transformers.transform(Transformers.java:120)
at net.orfjackal.retrolambda.Transformers.transform(Transformers.java:106)
at net.orfjackal.retrolambda.Transformers.backportClass(Transformers.java:46)
at net.orfjackal.retrolambda.Retrolambda.run(Retrolambda.java:72)
at net.orfjackal.retrolambda.Main.main(Main.java:26) …
Run Code Online (Sandbox Code Playgroud)

java android travis-ci retrolambda

5
推荐指数
1
解决办法
818
查看次数

安装了最新版本的Android Studio,我在构建项目时发生了异常?

一个Android项目,旧版Android Studio很不错.但在我更新IDE版本后,当我使用gradle构建项目时会发生异常.

这是问题所在:

错误:任务':jellyrefresh:compileReleaseJava'的执行失败.

使用java 5,6或7运行gradle时,必须使用属性retrolambda.jdk或环境变量JAVA8_HOME设置jdk8的路径

问题是,我的环境是Windows XP(我不想更新),所以我无法安装Java 8,因此无需告诉我这样做.但我仍然想使用Android Studio的最新版本.

那么这个例外的最合理解决方案是什么?

android gradle android-studio retrolambda

5
推荐指数
2
解决办法
2236
查看次数

使用Android Gradle实验插件时如何指定sourceCompatibility编译选项

我目前正在其中一个应用程序中使用Android Gradle Experiment插件,并且希望能够使用retrolambda库。要求之一是指定一些compileOptions。在普通的android build插件中,这有效:

  android {
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
  }
Run Code Online (Sandbox Code Playgroud)

对于新的实验性插件,我在model.android下添加了它:

model {
  android {
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

但是,上述结果导致gradle同步错误:

Gradle 'ApkTestRunner' project refresh failed
Error:Cause: com.android.build.gradle.managed.AndroidConfig$Impl
Run Code Online (Sandbox Code Playgroud)

如何使用新的Android实验性Gradle插件设置sourceCompatibility和targetCompatibility?

谢谢。

android android-gradle-plugin retrolambda gradle-experimental

5
推荐指数
1
解决办法
4116
查看次数

使用Retrofit和Realm在RxJava中纠正流程

我正在使用RxJava和Retrofit的组合实现网络API,我使用Realm作为我的数据库.我得到了相当多的工作,但我想知道它是否是正确的方法和事件的流程.所以,这是RetrofitApiManager.

public class RetrofitApiManager {

    private static final String BASE_URL = "***";

    private final ShopApi shopApi;

    public RetrofitApiManager(OkHttpClient okHttpClient) {

        // GSON INITIALIZATION

        Retrofit retrofit = new Retrofit.Builder()
                .client(okHttpClient)
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .addConverterFactory(GsonConverterFactory.create(gson))
                .baseUrl(BASE_URL)
                .build();

        shopApi = retrofit.create(ShopApi.class);
    }

    public Observable<RealmResults<Shop>> getShops() {
        return shopApi.getShops()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .doOnNext(response -> {
                    Realm realm = Realm.getDefaultInstance();
                    realm.executeTransaction(realm1 -> 
                            realm1.copyToRealmOrUpdate(response.shops));
                    realm.close();
                })
                .flatMap(response -> {
                    Realm realm = Realm.getDefaultInstance();
                    Observable<RealmResults<Shop>> results = realm.where(Shop.class)
                            .findAllAsync()
                            .asObservable()
                            .filter(RealmResults::isLoaded);
                    realm.close();
                    return results;
                });
    }
}
Run Code Online (Sandbox Code Playgroud)

这是呼吁 …

android realm rx-java retrofit retrolambda

5
推荐指数
1
解决办法
5027
查看次数