2016-04-09 30 views
0

bir nesnenin üyeleri tedavisini uygula:Rxjava: Bir html sayfası bir liste içeren bir nesne dönen bir işlevi Hava

@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); 
       } 
      }); 
} 

sonraki yapmak istiyorum nedir:

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

ve sonunda orijinal MediaList nesnesini değiştirilen görüntü URL'leriyle döndürün. Sanırım bir yere flatmap ve from kullanmalıyım, ama nasıl olduğunu bilmiyorum.

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]; 
     } 
    }; 
} 

cevap

0

Tek yönlü:

@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; 
} 

onlar bunu yapmak kolay yolları olduğunu düşünüyorum, ama işe yarıyor.

1

Burada söz konusu olan tüm sınıfları sahip değilim gibi, bu yüzden ne istediğinizi elde etmek için yardımcı olacak bir Rx kod yazdım:

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

Sorununuzu düzeltirse veya daha fazla ayrıntıya ihtiyacınız varsa bildirin. RxJava ile elde etmek istediğiniz şey kesinlikle mümkün. Bunu yapmak için

+0

Bu iyi bir başlangıç. Ama sonunda istediğim, gerçekten bir Liste ve nextPageUrl'den oluşan MediaList nesnesi. Ama belki mimarim değiştirilmelidir. – Nicolas