2014-11-24 101 views
0

所以我有一個異步操作A取決於第二個,B。如何使B成爲A的延續,就像您在.NET TPL中使用then函數的函數或ContinueWith一樣?如何使用RxJava Observables進行延續?

讓我們從Android上scenarion在那裏我有兩個服務端點:

  • 一個用於提取網址的圖像
  • 一個用於讀取圖像本身

代碼:

private void loadImage(final ImageView imageView) { 
    Observable<String> stringObs = getImageUrlAsync(); 
    stringObs.subscribe(new Action1<String>() { 
     @Override 
     public void call(String imageUrl) { 
      // First async operation done 
      Observable<Bitmap> bitmapObs = getBitmapAsync(imageUrl); 
      bitmapObs.subscribe(new Action1<Bitmap>() { 
       @Override 
       public void call(Bitmap image) { 
        // second async operation done 
        imageView.setImageBitmap(image); 
       } 
      }); 
     } 
    }); 
} 

我想不是使這兩個操作以代碼方式嵌套,但按照更像它的格式進行操作。

我一直無法找到有關RxJava/RxAndroid中Observable的延續。任何人都可以幫忙嗎?

回答

11

我想你需要API flatMap

如:

Observable.create(new Observable.OnSubscribe<String>() { 
     @Override 
     public void call(Subscriber<? super String> subscriber) { 
      subscriber.onNext("imageUrl"); 
     } 
    }).flatMap(new Func1<String, Observable<Bitmap>>() { 
     @Override 
     public Observable<Bitmap> call(String imageUrl) { 
      return getBitmapAsync(imageUrl); 
     } 
    }).subscribe(new Action1<Bitmap>() { 
     @Override 
     public void call(Bitmap o) { 
      imageView.setImageBitmap(image); 
     } 
    });