我正在将用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。
答案 0 :(得分:3)
在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>)