Android RxJavaAndroid技术知识Android开发经验谈

RxDialog(一) -- 一个基于RxJava的Dialog

2017-10-28  本文已影响412人  雷l阵l雨

效果图

Rxdialog.gif

看图是和普通的Dialog一样。
RxDialog的作用就是把一个普通的Dialog的按钮点击事件转化成Rxjava的形式。

我们先来看下普通的创建Dialog的形式:

new AlertDialog.Builder(MainActivity.this)
        .setTitle("title")
        .setMessage("Message")
        .setPositiveButton("确定", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {

            }
        })
        .setNegativeButton("取消", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {

            }
        })
        .show();

再来看下RxDialog的创建形式:

new MyRxDialog(MainActivity.this)
        .setTitle("title")
        .setMessage("Message")
        .setPositiveText("确定")
        .setNegativeText("取消")
        .setNeutralText("中立")
        .dialogToObservable()
        .subscribe(new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) throws Exception {
                switch (integer){
                    case MyRxDialog.POSITIVE:
                        Toast.makeText(MainActivity.this, "Positive", Toast.LENGTH_SHORT).show();
                        break;
                    case MyRxDialog.NEGATIVE:
                        Toast.makeText(MainActivity.this, "Negative", Toast.LENGTH_SHORT).show();
                        break;
                    case MyRxDialog.NEUTRAL:
                        Toast.makeText(MainActivity.this, "Neutral", Toast.LENGTH_SHORT).show();
                        break;
                    default:
                        Log.e("MyRxDialog", integer+"");
                        break;
                }
            }
        });

具体实现

我们可以看到RxDialog和普通的Dialog的差别就在于dialogToObservable(),其实就是把click事件转化为了Observable,这样就可以支持Rxjava了。
接下来看下dialogToObservable()的实现方式:

public Observable dialogToObservable(){
    return Observable.create(new ObservableOnSubscribe<Integer>() {
        @Override
        public void subscribe(@NonNull final ObservableEmitter<Integer> e) throws Exception {
            DialogInterface.OnClickListener onClickListener = new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    switch (i){
                        case -1:
                            e.onNext(POSITIVE);
                            break;
                        case -2:
                            e.onNext(NEGATIVE);
                            break;
                        case -3:
                            e.onNext(NEUTRAL);
                            break;
                        default:
                            e.onNext(i);
                    }
                }
            };
            builder.setPositiveButton(positiveText, onClickListener);
            builder.setNegativeButton(negativeText, onClickListener);
            builder.setNeutralButton(neutralText, onClickListener);
            builder.show();
        }
    });
}

这里其实就是创建了一个Observable,是不是很简单,不过很多人可能会使用Flowable,这里也提供了。

public Flowable dialogToFlowable(){
    return Flowable.create(new FlowableOnSubscribe() {
        @Override
        public void subscribe(@NonNull final FlowableEmitter e) throws Exception {
            DialogInterface.OnClickListener onClickListener = new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    switch (i){
                        case -1:
                            e.onNext(POSITIVE);
                            break;
                        case -2:
                            e.onNext(NEGATIVE);
                            break;
                        case -3:
                            e.onNext(NEUTRAL);
                            break;
                        default:
                            e.onNext(i);
                    }
                }
            };
            builder.setPositiveButton(positiveText, onClickListener);
            builder.setNegativeButton(negativeText, onClickListener);
            builder.setNeutralButton(neutralText, onClickListener);
            builder.show();
        }
    }, BackpressureStrategy.BUFFER);
}

核心代码就这么多,具体实现请看源码

欢迎关注.jpg
上一篇下一篇

猜你喜欢

热点阅读