2015-12-22 7 views
6

Tüm API isteklerini eşzamansız bir şekilde işlemek için ağ yığınımızda ReactiveX ve Retrofit kullanıyoruz.Modelleri doldurmak için birden çok istek kullanılan RXJava Observables kullanılarak nasıl kullanılabilir?

Hedefimiz, User modellerinin tamamen doldurulmuş bir koleksiyonunu döndürecek bir yöntem oluşturmaktır. Her User modelinde Pet nesnenin bir listesi vardır. Tek bir istekle User modellerini getirebiliriz. Ancak, User için Pet modelleri talep edilmelidir.

Alma kullanıcıların basit:

// Service.java 
@GET("users/?locationId={id}") 
Observable<List<User>> getUsersForLocation(@Path("id") int locationId); 

@GET("pets/?userId={id}") 
Observable<List<Pet>> getPetsForUser(@Path("id") int userId); 

// DataManager.java 
public Observable<List<User>> getUsersForLocation(int locationId) { 
    return api.getUsersForLocation(locationId); 
} 

public Observable<List<Pet>> getPetsForUser(int userId) { 
    return api.getPetsForUser(userId); 
} 

Biz User atayarak, User Listede döngü her kullanıcı için Pet s getirilirken bazı uygun (RX tarzı) yol bulmak istiyoruz ve En sonunda Observable<List<User>> döndürüyor.

RX için oldukça yeni. Belgelere baktım ve flatMap() ve zip gibi çeşitli yöntemleri kullanmayı denedim, ancak bunun gerçekleşmesi için dönüşümlerin veya birleştiricilerin tam kombinasyonunu henüz bulamadım.

+2

Bu sunumda Jake Wharton tam olarak bunu yapar: https://goo.gl/01Evkm – rciovati

+0

Bağlantı için teşekkürler. Şu anda Java 7 kullanıyorum ve bu sunumda lambdas kullanımı, bu yöntemde olup bitenleri flatMap() 'e çağırıyor. Herhangi bir anlayış? – JeremyFromEarth

cevap

5

Elde etmeye çalıştığınız şeyi yapan küçük bir örnek uygulama yazdım. İşte bileşenleri:

public class Datasource { 

    public Observable<List<User>> users() { 
     return Observable.just(Arrays.asList(
       new User("1", "Foo"), new User("2", "Bar") 
     )); 
    } 

    public Observable<List<Pet>> pets(User user) { 
     return Observable.just(Arrays.asList(
       new Pet(user.getName() + "'s cat"), 
       new Pet(user.getName() + "'s dog") 
     )); 
    } 
} 

Pet sınıfı:

public class Pet { 
    private String mName; 

    public Pet(String name) { 
     mName = name; 
    } 

    public String getName() { 
     return mName; 
    } 

    @Override 
    public String toString() { 
     return "Pet{" + 
       "mName='" + mName + '\'' + 
       '}'; 
    } 
} 

Kullanıcı sınıfı:

public class User { 

    private String mName; 
    private String mId; 
    private List<Pet> mPetList; 

    public User(String id, String name) { 
     this(id, name, Collections.<Pet>emptyList()); 
    } 

    public User(String id, String name, List<Pet> pets) { 
     mName = name; 
     mId = id; 
     mPetList = pets; 
    } 

    public String getName() { 
     return mName; 
    } 

    public String getId() { 
     return mId; 
    } 

    public User copyWithPets(List<Pet> pets) { 
     return new User(mId, mName, pets); 
    } 

    @Override 
    public String toString() { 
     return "User{" + 
       "mName='" + mName + '\'' + 
       ", mId='" + mId + '\'' + 
       ", mPetList=" + mPetList + 
       '}'; 
    } 
} 

hep birlikte koyun:

datasource.users() 
     .flatMap(new Func1<List<User>, Observable<User>>() { 
      @Override 
      public Observable<User> call(List<User> users) { 
       return Observable.from(users); 
      } 
     }) 
     .flatMap(new Func1<User, Observable<User>>() { 
      @Override 
      public Observable<User> call(final User user) { 
       return datasource.pets(user) 
         .map(new Func1<List<Pet>, User>() { 
          @Override 
          public User call(List<Pet> pets) { 
           return user.copyWithPets(pets); 
          } 
         }); 
      } 
     }) 
     .toList() 
     .subscribe(new Action1<List<User>>() { 
      @Override 
      public void call(List<User> users) { 
       for (User user : users) { 
        Log.d(TAG, "user: " + user.toString()); 
       } 
      } 
     }); 

Bu üretir:

D/MainActivity: user: User{mName='Foo', mId='1', mPetList=[Pet{mName='Foo's cat'}, Pet{mName='Foo's dog'}]} 
D/MainActivity: user: User{mName='Bar', mId='2', mPetList=[Pet{mName='Bar's cat'}, Pet{mName='Bar's dog'}]} 

Size yanıt vermezse, lütfen Kullanıcı ve Evcil hayvan için gerçek veri modelini gönderin.

+0

Harika, böyle vay! Gönderin bana da yardım etti! Teşekkürler bayım! :) – rxDroid

İlgili konular