RxJava 2一次性活动破坏

时间:2018-06-10 10:27:18

标签: java android rx-java2

我是RxJava / 2的新手,使用Observable进行表单验证。

如何在活动销毁时处置我的Observable?

我的代码:

     private Observable<CharSequence> passwordChangeObservable = 
RxTextView.textChanges(passwordTxt);

    passwordChangeObservable
                    .debounce(400, TimeUnit.MILLISECONDS)
                    .map(this::isValidPassword)
    //                .distinctUntilChanged()
                    .subscribeOn(Schedulers.io()) // Or Schedulers.newThread()
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(new Observer<Boolean>() {

                        @Override
                        public void onSubscribe(Disposable d) {

                        }

                        @Override
                        public void onNext(Boolean aBoolean) {

                        }

                        @Override
                        public void onError(Throwable e) {

                        }

                        @Override
                        public void onComplete() {

                        }
                    });

 private Boolean isValidPassword(CharSequence value) {
        return value.toString().matches("^(?=.*\\d).{4,8}$");
    } 

这个没有返回任何东西来保存引用并处理清理?

1 个答案:

答案 0 :(得分:1)

正如@Blackbelt建议的那样,subscribe()有一些重载版本(请参阅docs)。

  • 多个采用ConsumerAction
  • 的组合
  • 采用Observer
  • 的人

前者返回一个Disposable实例,可以终止订阅;后者没有。因此,如果您希望在onDestroy()中处理自己的信息流,则应更改您正在使用的subscribe()版本。

在结构上,它看起来像这样:

public class Blah extends AppCompatActivity {

    private EditText passwordTxt;

    private Disposable disposable;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        disposable = RxTextView.textChanges(passwordTxt)
                .debounce(400, TimeUnit.MILLISECONDS)
                .map(this::isValidPassword)
                .subscribeOn(Schedulers.io()) // Or Schedulers.newThread()
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(
                        new Consumer<Boolean>() {
                            @Override
                            public void accept(Boolean aBoolean) throws Exception {
                                // onNext
                            }
                        },
                        new Consumer<Throwable>() {
                            @Override
                            public void accept(Throwable throwable) throws Exception {
                                // onError
                            }
                        },
                        new Action() {
                            @Override
                            public void run() throws Exception {
                                // onComplete
                            }
                        },
                        new Consumer<Disposable>() {
                            @Override
                            public void accept(Disposable disposable) throws Exception {
                                // onSubscribe
                            }
                        }
                );
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

        if(disposable != null && !disposable.isDisposed()) {
            disposable.dispose();
        }
    }

    private Boolean isValidPassword(CharSequence value) {
        return value.toString().matches("^(?=.*\\d).{4,8}$");
    }

}

(虽然lambdas可以真正缩短,从而提高代码的可读性,但我选择不使用它们以便清楚地说明使用的类型)。