2014-09-28 49 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>)