2016-04-09 68 views
0

我哈瓦它返回從一個HTML頁面包含一個列表對象的成員函數的應用處理:Rxjava:上一個對象

@Override 
public Observable<MediaList> getMediaListFromUrl(String url) { 
    return getHtml(url) 
      .map(new Func1<String, MediaList>() { 
       @Override 
       public MediaList call(String s) { 
        return interpreter.interpretMediaResultsFromHtml(s); 
       } 
      }); 
} 

我想下一步要做的是:

for(Media media : mediaList.getMedias()) { 
    if (media.getImageUrl().contains("couvertureAjax")) { 
     // fetch media.getImageUrl 
     // replace the image url with the result 
    } 
} 

並在最後,返回與替換的圖像網址的原始MediaList對象。 我認爲我應該在某處使用flatmapfrom,但我不知道如何。

MediaList.java

import android.os.Parcel; 
import android.os.Parcelable; 

import java.util.List; 

public class MediaList implements Parcelable { 
    public static final String TAG = MediaList.class.getSimpleName(); 
    private List<Media> medias; 
    private String nextPageUrl; 

    public MediaList() {} 

    protected MediaList(Parcel in) { 
     medias = in.createTypedArrayList(Media.CREATOR); 
     nextPageUrl = in.readString(); 
    } 

    public List<Media> getMedias() { 
     return medias; 
    } 

    public void setMedias(List<Media> medias) { 
     this.medias = medias; 
    } 

    public String getNextPageUrl() { 
     return nextPageUrl; 
    } 

    public void setNextPageUrl(String nextPageUrl) { 
     this.nextPageUrl = nextPageUrl; 
    } 

    @Override 
    public void writeToParcel(Parcel dest, int flags) { 
     dest.writeTypedList(medias); 
     dest.writeString(nextPageUrl); 
    } 

    @Override 
    public int describeContents() { 
     return 0; 
    } 

    public static final Creator<MediaList> CREATOR = new Creator<MediaList>() { 
     @Override 
     public MediaList createFromParcel(Parcel in) { 
      return new MediaList(in); 
     } 

     @Override 
     public MediaList[] newArray(int size) { 
      return new MediaList[size]; 
     } 
    }; 
} 

回答

0

方式一:

@Override 
public Observable<MediaList> getMediaList(String url) { 
    return getHtml(url) 
      .flatMap(new Func1<String, Observable<MediaList>>() { 
       @Override 
       public Observable<MediaList> call(String s) { 
        MediaList mediaList = interpreter.interpretMediaResultsFromHtml(s); 
        Observable<List<Media>> list = Observable.from(mediaList.getMedias()) 
          .flatMap(new Func1<Media, Observable<Media>>() { 
           @Override 
           public Observable<Media> call(Media media) { 
            if (media.needImagePreload()) { 
             return getMediaLoadedImage(media.getImageUrl(), media); 
            } else { 
             return Observable.just(media); 
            } 
           } 
          }) 
          .toList(); 
        return Observable.zip(Observable.just(mediaList.getNextPageUrl()), list, new Func2<String, List<Media>, MediaList>() { 
         @Override 
         public MediaList call(String s, List<Media> medias) { 
          return zipMediaList(s, medias); 
         } 
        }); 
       } 
      }); 
} 


private MediaList zipMediaList(String s, List<Media> medias) { 
    MediaList mediaList = DefaultFactory.MediaList.constructDefaultInstance(); 
    mediaList.setNextPageUrl(s); 
    mediaList.setMedias(medias); 
    return mediaList; 
} 

我認爲他們是更簡單的方法來做到這一點,但它的作品。

1

,因爲我不具有在這裏所涉及的所有課程,所以我寫了一個的Rx代碼,將有助於實現你想要什麼:

getHtml(url) 
       .flatMap(new Func1<String, Media>() { 
        @Override 
        public Media call(String s) { 
         // Here update code interpreter.interpretMediaResultsFromHtml(s) and make sure your return List<Media> from here 
         return Observable.from(interpreter.interpretMediaResultsFromHtml(s)); 
        } 
       }) 
       .map(new Func1<Media, Media>() { 
        @Override 
        public Media call(Media media) { 
         // Write code here to update Url in media and return it 
         return null; // Return updated media object from here 
        } 
       }) 
       .toList() 
       .subscribe(new Action1<List<Media>>() { 
        @Override 
        public void call(List<Media> mediaList) { 
         // Here MediaLkist object will be your updated List<Media> 
        } 
       }); 

讓我知道它是否解決了你的問題,或者你需要更多的細節。通過RxJava可以實現你想要達到的目標。要做到這一點

+0

這是一個好的開始。但最後我想要的是真正的MediaList對象,它包含一個List 和nextPageUrl。但也許我的架構應該改變。 – Nicolas