android - 仅当 Fragment 在 ViewPager 中可见时才触发 RxJava 事件更改

标签 android android-fragments rx-java rx-android

我在 Activity 中有一个 EditText,用户可以在其中键入和搜索内容。在搜索栏下方,我有 2 个 tabs 附加到 ViewPager。我在标签的 2 个 Fragments 中为 EditText 添加了一个 RxJava 事件更改监听器。相关代码如下:

    private Subscription subscription;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_people_search, container, false);
        ButterKnife.bind(this, view);
        LogUtil.i(TAG, "onCreateView called");

        if (getActivity() != null) {
            inputSearch = (EditText) getActivity().findViewById(R.id.editText11);
        }

        return view;
    }

    @Override
    public void onResumeFragment() {
        LogUtil.i(TAG, "onResumeFragment called");
        if (subscription == null) {
            doSearch();
        }
    }

    private void doSearch() {
        LogUtil.i(TAG, "doSearch called");
        subscription = RxTextView.textChangeEvents(inputSearch)
                .debounce(400, TimeUnit.MILLISECONDS)
                .map(new Func1<TextViewTextChangeEvent, String>() {
                    @Override
                    public String call(TextViewTextChangeEvent textViewTextChangeEvent) {
                        return textViewTextChangeEvent.text().toString().trim();
                    }
                })
                .switchMap(new Func1<String, Observable<SearchUserData>>() {
                    @Override
                    public Observable<SearchUserData> call(String s) {
                        term = s;
                        if (previousTerm.equalsIgnoreCase(term) && TextUtils.isEmpty(term)) {
                            //do not reset pagination variables
                        } else if (!previousTerm.equalsIgnoreCase(term) && TextUtils.isEmpty(term)) {
                            min = 0;
                            max = 14;
                        } else if (previousTerm.equalsIgnoreCase(term) && !TextUtils.isEmpty(term)) {
                            //do not reset pagination variables
                        } else {
                            min = 0;
                            max = 14;
                        }
                        loadMoreOrNot = true;
                        previousTerm = term;
                        DiscoverAPI discoverAPI = restAdapter.create(DiscoverAPI.class);
                        return discoverAPI.getRxPeopleSearchResult(min, max, s, "user");
                    }
                })
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(getRxSearchObserver());
    }

我想要的是,当我搜索某些内容时,查询应该只针对当前选择的选项卡进入后端,而不是针对这两个选项卡。我该怎么做?

最佳答案

我认为有两种选择。

使用过滤器:

    subscription = RxTextView.textChangeEvents(inputSearch)
            .debounce(400, TimeUnit.MILLISECONDS)
            .filter(textViewTextChangeEvent -> getUserVisibleHint())
            .map(..)
            ...

或者在调用 setUserVisibleHint 时订阅/取消订阅(正如@Amir 评论的那样):

    @Override
    public void onResumeFragment() {
        //don't subscribe here
    }

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);

        if (subscription != null) {
            subscription.unsubscribe();
            subscription = null;
        }
        if (isVisibleToUser) {
            doSearch();
        }
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();

        if (subscription != null) {
            subscription.unsubscribe();
            subscription = null;
        }
    }

关于android - 仅当 Fragment 在 ViewPager 中可见时才触发 RxJava 事件更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39292308/

相关文章:

java - 是否可以使用双簧管库同时在 Android 中打开 2 个麦克风?

java - EditText 无法将文本设置为格式化字符串

Android Fragment 顶级布局无法以编程方式访问

android - 从 Fragment 访问 EditTextPreference 的文本

android - 不同屏幕尺寸的 fragment

java - 使用scaledBitmap创建透明度/镜像效果时避免致命内存错误

java - 如何在整个应用程序中更改 Textview 的字体系列?

android - 在 RxJava 2.0 中订阅 PublishSubject

android - 如何在 RxJava 中链接任务

system.reactive - 用响应式(Reactive)编程画线的地方