2016-10-20 123 views
1

我正在應用程序中,而不是轉換其他對象中的對象的一個​​列表,爲此,我使用Rx Java的Observable。RxJava - Observable:一個可觀察比返回其他Observable

我有兩種方法,一種是一個適配器(新澤西門面),其具有一個ASYN服務和該方法中從其他服務一個可觀察消耗。

我需要消耗可觀察和處理每一個項目時,該上課完整的我NEDD創建處理的所有項目的一個列表,並返回一個新的可觀察其中E是處理的每個項目的列表。

要處理每個項目我使用flatMap操作符,但我不知道如何創建一個新的觀察者,其中一個類型diferente由示例flatmap運算符處理的所有每個列表。

任何想法?

感謝

更新:

此代碼,過程中的每個元素和具有返回其他可觀察的,但我不知道這是否是做得很好。

@Override 
public Observable<ArrayList> getGeoJson2() { 
    WKTReader2 reader2 = new WKTReader2(); 
    WKBReader wkbReader = new WKBReader(); 
    ArrayList featureCollection = new ArrayList(); 

    Subject<ArrayList,ArrayList> subject = PublishSubject.create(); 

    manzanaRepository.getManzanas().map(new Func1<Manzana, SimpleFeature>() { 
     @Override 
     public SimpleFeature call(Manzana manzana) { 
      try { 
       SimpleFeatureType TYPE = DataUtilities.createType("", "geom,name:String"); 
       return SimpleFeatureBuilder.build(TYPE, new Object[]{ null, "name1"}, null); 
      }catch (Exception e){ 
       System.out.println(e.getMessage()); 
       return null; 
      } 

     } 
    }).subscribe(new Subscriber<SimpleFeature>() { 
     @Override 
     public void onCompleted() { 
      subject.onNext(featureCollection); 
      subject.onCompleted(); 
     } 

     @Override 
     public void onError(Throwable throwable) { 
      subject.onError(throwable); 
     } 

     @Override 
     public void onNext(SimpleFeature simpleFeature) { 
      featureCollection.add(simpleFeature); 
     } 
    }); 

    return subject; 
} 

而且這個代碼是誰使用的可觀測海歸的一個:

@GET 
@Produces(MediaType.APPLICATION_JSON) 
@Path("/async/geom") 
public void asyncGetGeom(@Suspended final AsyncResponse asyncResponse) { 

    Observable<ArrayList> features = service.getGeoJson2(); 

    features.subscribe(new Observer<ArrayList>() { 
     @Override 
     public void onCompleted() { 

      System.out.println("Se completo la accion!!!"); 
     } 

     @Override 
     public void onError(Throwable throwable) { 

      System.out.println(throwable.getMessage()); 
     } 

     @Override 
     public void onNext(ArrayList features) { 
      asyncResponse.resume(features); 
     } 
    }); 
} 

的方法onNext()不會被調用!

感謝

+1

請提供一個短代碼的例子,你已經嘗試過目前爲止。 – ehehhh

+0

你也可以顯示這種方法返回什麼? 'manzanaRepository.getManzanas()' – ehehhh

+0

可觀察

回答

1

嘗試更換您的getGeoJson2()這一點:

@Override 
public Observable<List<SimpleFeature>> getGeoJson2() { 
    return manzanaRepository.getManzanas() 
      .map(new Func1<Manzana, SimpleFeature>() { 
       @Override 
       public SimpleFeature call(Manzana manzana) { 
        try { 
         SimpleFeatureType TYPE = DataUtilities.createType("", "geom,name:String"); 
         return SimpleFeatureBuilder.build(TYPE, new Object[]{ null, "name1"}, null)); 
        } catch (Exception e) { 
         System.out.println(e.getMessage()); 
         return null; 
        } 
       } 
      }) 
      .filter(new Func1<SimpleFeature, Boolean>() { 
       @Override 
       public Boolean call(SimpleFeature sf) { 
        return sf != null; 
       } 
      }) 
      .toList(); 
} 

說明:toList()運營商使用,從源頭觀察到等待onCompleted,然後發出由源發射的所有項目作爲列表可觀察到。

+0

感謝您的回覆,但如果我想返回一個可觀察其中X是不是列表,並通過各加工項目,以及其他信息構成。 如何創建新的觀察者? –

+0

我想你會在'toList'之後使用'map'和/或'flatMap'。我需要看到更多的代碼才能給出更好的答案:D – ehehhh

0

與您的代碼的問題是,你正在使用PublishSubject你開始使用它

,如果將其更改爲BehaviorSubject,它會工作

但是之前它完成,更好的(和更短)來實現它如下 -

manzanaRepository.getManzanas().map(/**/).collect(/*create array*/, /*add next item*/) 
相關問題