有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java(RxJava)移植的Groovy方法不起作用

我正在将用Java编写的Android应用程序移植到Groovy。我试图使用Groovy闭包,但它不起作用。编译和运行时没有错误,但什么也没发生

这是一个不起作用的版本

    Observable.create({
        Subscriber<Bin> subscriber ->
            new Thread(new Runnable() {
                @Override
                void run() {
                    List<List<String>> lists = binData.getData()
                    for (List<String> strings : lists) {
                        try {
                            Bin bin = ... // shorten for brevity
                            subscriber.onNext(bin)
                        } catch (Exception ex) {}
                    }
                    subscriber.onCompleted()
                }
            }).start()
    })

这个版本很好用。它是有效的Groovy,但有点冗长

    Observable.create(new Observable.OnSubscribe<Bin>() {
        @Override
        public void call(final Subscriber<? super Bin> subscriber) {
            final Thread t = new Thread(new Runnable() {
                @Override
                public void run() {
                    List<List<String>> lists = binData.getData();
                    for (List<String> strings : lists) {
                        try {
                            Bin bin = ... // shorten for brevity
                            subscriber.onNext(bin)
                        } catch (Exception ex) {}
                    }
                    subscriber.onCompleted()
                }
            })
            t.start()
        }
    })

我想这和闭包或类型有关,但我不明白。有什么想法吗?谢谢

我下面的例子是在https://github.com/ReactiveX/RxJava/wiki/How-To-Use-RxJava#asynchronous-observable-example


共 (1) 个答案

  1. # 1 楼答案

    Groovy 2.2之前,必须显式强制闭包以替换特定类型。即使在2.2之后,也可能出现一些边缘情况(例如generic parameters),其中隐式强制并不像预期的那样有效

    要强制,请应用as运算符。您还可以用闭包替换匿名Runnable

    Observable.create({ Subscriber<Bin> subscriber ->
        new Thread({ ->
            List<List<String>> lists = binData.getData()
            ... // shorten for brevity
        } as Runnable).start()
    } as Observable.OnSubscribe<Bin>)