2016-04-09 5 views
0

ich eine Funktion hava, die ein Objekt zurückgibt eine Liste von einer HTML-Seite mit:Rxjava: Tragen Sie Behandlung auf Mitglieder eines Objekts

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

Was würde ich als nächstes tun möchte, ist:

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

und zum Schluss das ursprüngliche MediaList-Objekt mit den ersetzten Bild-URLs zurückgeben. Ich denke, ich sollte irgendwo flatmap und from verwenden, aber ich weiß nicht genau wie.

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

Antwort

0

Eine Möglichkeit, dies zu tun:

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

Ich denke, sie einfachere Wege, dies zu tun, aber es funktioniert.

1

Da ich nicht alle Klassen, die die hier involviert sind, so habe ich einen Rx-Code geschrieben, der helfen würde, zu erreichen, was Sie wollen:

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

Lassen Sie es mich wissen, wenn es Ihr Problem behebt oder Sie weitere Informationen benötigen. Es ist definitiv möglich, was Sie über RxJava erreichen wollen.

+0

Es ist ein guter Anfang. Aber was ich am Ende will, ist wirklich das MediaList-Objekt, bestehend aus einer Liste und nextPageUrl. Aber vielleicht sollte meine Architektur geändert werden. – Nicolas

Verwandte Themen