无法找到封闭方法' void lambda $ getTestFlowable $ 0(io.reactivex.FlowableEmitter)'

时间:2017-05-12 10:04:05

标签: java android proguard rx-java2 retrolambda

我在我的项目中使用RxJava2和Retrolambda并且有一段时间我感觉非常好,将回调包装成可流动的,但有一天我遇到了这个错误,如果我尝试在这个非常简化的代码片段上运行proguard:

    private Flowable<Object> getTestFlowable() {
        return Flowable.create(emitter -> new Thread(new Runnable() {
            @Override
            public void run() {
                emitter.onNext("one");
                emitter.onComplete();
            }
        }).run(), BackpressureStrategy.BUFFER);
    }

然后我会得到这个警告,这使我的构建失败: 警告:com.yandex.testfield.MainActivity $ 1:无法找到封闭方法&#39; void lambda $ getTestFlowable $ 0(io.reactivex.FlowableEmitter)&#39;在程序类com.yandex.testfield.MainActivity

目前,我看到了两个针对此问题的临时解决方案:

  1. 不要使用lambda而是使用匿名类

    private Flowable<Object> getTestFlowable() {
        return Flowable.create(new FlowableOnSubscribe<Object>() {
            @Override
            public void subscribe(FlowableEmitter<Object> emitter) throws Exception {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        emitter.onNext("one");
                        emitter.onComplete();
                    }
                }).run();
             }
        }, BackpressureStrategy.BUFFER);
    }
    
  2. 在类上禁用proguard,其中包含上面列出的方法
  3. 但我仍然想知道为什么会这样?这是RxJava2 \ Retrolambda \ Proguard中的错误吗?

1 个答案:

答案 0 :(得分:5)

是的,这是retrolambda https://github.com/orfjackal/retrolambda/issues/121

中的错误

它已在2.5.1中修复,并合并到gradle-retrolambda 3.6.1

更新到3.6.1后,此错误消失