2016-04-25 11 views
0

私はショッピングカートを備えたAndroidアプリケーションを開発中です。 Cartオブジェクトはjava.lang.Observableに拡張されるため、変更があった場合はすぐにディスクに保存され、バッジアイコンを更新することもできます。java.lang.ObservableからRxJavaへの移行

public class Cart extends Observable{ 

    private Set<Product> products; 

    public Cart(){ 
     products = new HashSet<>(); 
    } 

    public Cart(Collection<Product> products){ 
     this.products = new HashSet<>(products); 
    } 

    public int getTotalItems() { 
     return products.size(); 
    } 

    public void clear(){ 
     products.clear(); 
     setChanged(); 
     notifyObservers(); 
    } 

    public void addProduct(Product product){ 
     products.add(product); 
     setChanged(); 
     notifyObservers(); 
    } 

    public void removeProduct(Product product){ 
     products.remove(product); 
     setChanged(); 
     notifyObservers(); 
    } 

    public void updateProduct(Product product){ 
     products.remove(product); 
     products.add(product); 
     setChanged(); 
     notifyObservers(); 
    } 

    public List<Product> getProducts() { 
     return new ArrayList<>(products); 
    } 
} 

使用例

public class MainActivity extends BaseActivity implements Observer { 
    Cart mCart; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     ButterKnife.bind(this); 

     getApp().getCart().addObserver(this); 
     setCartItemsCount(getApp().getCart().getTotalItems()); 

     //... 
    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     if (getApp().getCart() != null) { 
      getApp().getCart().deleteObserver(this); 
     } 
    } 

    @Override 
    public void update(Observable observable, Object data) { 
     if (observable instanceof Cart) { 
      setCartItemsCount(((Cart) observable).getTotalItems()); 
     } 
    } 
} 

私はRxJavaにこのコードを移行したいのですが、私はそれについて移動する方法についての明確な考えを持っていません。私が読んだところでは、私はBehavioralSubjectを使用するはずですが、私が私のシナリオに読んだ例をどのように適応させるかはわかりません。

いくつかのガイダンスや例があれば分かります。

答えて

1

アイデアをキャッチするのに役立つ小さな例をいくつか作成しました。私はこのライブラリhttps://github.com/trello/RxLifecycleを使用している は、私はまた、あなたが初心者

public class CartPresenter { 

    private final PublishSubject<CardModel> dataChangedSubject = PublishSubject.create(); 
    private final Observable<CardModel> cardObservable; 
    private final CardModel cardModel; 

    public CartPresenter() { 
     cardModel = new CardModel(); 

     this.cardObservable = dataChangedSubject.startWith(cardModel) 
       .flatMap(new Func1<CardModel, Observable<CardModel>>() { 
        @Override 
        public Observable<CardModel> call(CardModel cardModel) { 
         return Observable.just(cardModel); 
        } 
       }); 
    } 

    public CardModel getCardModel() { 
     return cardModel; 
    } 

    @NonNull 
    public Observable<CardModel> getCardObservable() { 
     return cardObservable; 
    } 

    class CardModel { 
     final private Set<Integer> products; 

     public CardModel() { 
      this.products = new HashSet<>(); 
     } 

     public void addProduct(Integer integer) { 
      products.add(integer); 
      dataChangedSubject.onNext(this); 
     } 

     public Set<Integer> getProducts() { 
      return products; 
     } 
    } 
} 

のためにそして、いくつかのより高度なユーザーのために理解するために、このhttp://google.github.io/dagger/

public class MainActivity extends RxActivity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    final CartPresenter cartPresenter = new CartPresenter(); 
    final TextView counterTextView = (TextView) findViewById(R.id.counter); 
    final Button button = (Button) findViewById(R.id.button2); 

    RxView.clicks(button) 
      .subscribe(new Action1<Void>() { 
       @Override 
       public void call(Void aVoid) { 
        cartPresenter.getCardModel().addProduct(new Random().nextInt(100)); 
       } 
      }); 

    cartPresenter.getCardObservable() 
      .compose(this.<CartPresenter.CardModel>bindToLifecycle()) 
      .subscribe(new Action1<CartPresenter.CardModel>() { 
       @Override 
       public void call(CartPresenter.CardModel cardModel) { 
        counterTextView.setText(String.valueOf(cardModel.getProducts().size())); 
       } 
      }); 
} 
} 

一つの解決策に簡単に使用することをお勧めします

public class CartPresenter { 

    private final PublishSubject<CardModel> dataChangedSubject = PublishSubject.create(); 
    private final Observable<CardModel> cardObservable; 
    private final CardModel cardModel; 

    public CartPresenter() { 
     cardModel = new CardModel(); 

     this.cardObservable = Observable.just(cardModel) 
       .compose(new Observable.Transformer<CardModel, CardModel>() { 
        @Override 
        public Observable<CardModel> call(final Observable<CardModel> cardModelObservable) { 
         return dataChangedSubject.switchMap(new Func1<Object, Observable<? extends CardModel>>() { 
          @Override 
          public Observable<? extends CardModel> call(Object o) { 
           return cardModelObservable; 
          } 
         }); 
        } 
       }); 

    } 

    public CardModel getCardModel() { 
     return cardModel; 
    } 

    @NonNull 
    public Observable<CardModel> getCardObservable() { 
     return cardObservable; 
    } 

    class CardModel { 
     final private Set<Integer> products; 

     public CardModel() { 
      this.products = new HashSet<>(); 
     } 

     public void addProduct(Integer integer) { 
      products.add(integer); 
      dataChangedSubject.onNext(null); 
     } 

     public Set<Integer> getProducts() { 
      return products; 
     } 
    } 
} 
関連する問題