2014-09-28 60 views
2

我将使用Java编写的Android应用程序移植到Groovy。我正在尝试使用Groovy闭包,但它不起作用。编译并运行时没有错误,但没有任何反应。(RxJava)移植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

+2

你尝试强迫通过'作为Observable.OnSubscribe '关闭? – bdkosher 2014-09-29 14:04:59

+0

@BDKosher还没有。我会尝试并让你知道。 – pt2121 2014-09-29 15:16:19

+0

@BDKosher你是对的。谢谢!你想回答吗?我会接受它。 – pt2121 2014-09-29 17:30:23

回答

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>)