简体   繁体   English

从java.lang.Observable迁移到RxJava

[英]Migrating from java.lang.Observable to RxJava

I'm working on an Android application that features a shopping cart. 我正在使用带有购物车的Android应用程序。 The Cart object extends java.lang.Observable so if there are any changes, they are saved to the disk immediately and also so that the badge icon can be updated. Cart对象扩展了java.lang.Observable因此,如果有任何更改,它们将立即保存到磁盘,并且还可以更新徽章图标。

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

Example usage 用法示例

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

I'd like to migrate this code to RxJava but i don't have a clear idea on how to go about it. 我想将此代码迁移到RxJava,但是我对如何执行它并不清楚。 From what I read, I'm supposed to use BehavioralSubject but I don't know how to adapt the examples I've read to my scenario. 从我所读的内容中,我应该使用BehavioralSubject但是我不知道如何使我所阅读的示例适合我的场景。

I would appreciate if some guidance or an example. 如果有一些指导或示例,我将不胜感激。

I made some small example that can help you catch the idea. 我举了一些小例子,可以帮助您理解这个想法。 I have used this library https://github.com/trello/RxLifecycle , I also recommend you to use this http://google.github.io/dagger/ 我已经使用了这个库https://github.com/trello/RxLifecycle ,我也建议您使用这个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()));
                }
            });
}
}

One solution simpler to understand for a beginner 一种初学者更容易理解的解决方案

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

And for some more advanced users 对于一些更高级的用户

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM