【问题标题】:RXJava Async help needed. input blocked by call需要 RXJava 异步帮助。输入被调用阻塞
【发布时间】:2015-11-03 16:46:03
【问题描述】:

我有以下代码,可以很好地在列表视图中显示结果。问题是键入时调用会阻塞键盘,但是当我尝试在 io 线程上订阅时它不起作用。我的问题是:调用我的休息界面的正确位置在哪里?

o1 = RxTextView.textChangeEvents(etSearch).throttleLast(500, TimeUnit.MILLISECONDS)
            .map(new Func1<RxTextViewTextChangeEvent, String>() {
                     @Override
                     public String call(RxTextViewTextChangeEvent rxTextViewTextChangeEvent) {
                         return etSearch.getText().toString();
                     }
                 }
            );
    o1.observeOn(RxAndroidSchedulers.mainThread()).filter(new Func1<String, Boolean>() {
        @Override
        public Boolean call(String s) {
            return s.length() > 2;
        }
    }).subscribe(new Action1<String>() {
        @Override
        public void call(String s) {

                List<CrewMember> crewMemberList = rest.getCrewMemberList(s);
                ListView crewFinderResultsListView = (ListView) findViewById(R.id.list);
                crewMemberAdapter = new CrewFinderResultRowAdapter(mContext, getLayoutInflater());
                crewMemberAdapter.setCrewMemberList(crewMemberList);
                crewFinderResultsListView.setAdapter(crewMemberAdapter);

        }
    });

【问题讨论】:

    标签: android android-asynctask rx-java rx-android


    【解决方案1】:

    我的猜测是rest.getCrewMemberList(s) 是网络调用或其他阻止主线程的阻塞调用。如果是第一个,您可能会在主线程异常上得到一个网络,因为您没有使用带有错误回调的subscribe 重载,所以该异常被吞没了。您必须将调用移至 io() 调度程序:

    RxTextView.textChangeEvents(etSearch)
        .throttleLast(500, SECONDS)
        .filter(s -> s.length() > 2)
        .switchMap(s -> 
            Observable.fromCallable(() -> rest.getCrewMemberList(s))
            .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(crewMembersList -> {
            ListView crewFinderResultsListView = (ListView) findViewById(R.id.list);
                crewMemberAdapter = new CrewFinderResultRowAdapter(
                    mContext, getLayoutInflater());
                crewMemberAdapter.setCrewMemberList(crewMemberList);
                crewFinderResultsListView.setAdapter(crewMemberAdapter);
        },
        e -> Log.d(...));
    

    【讨论】:

    • 仍在尝试让我的工作,但我明白你的建议,这似乎是要走的路。感谢您的帮助!
    猜你喜欢
    • 2015-10-13
    • 1970-01-01
    • 2016-01-29
    • 2013-07-11
    • 1970-01-01
    • 1970-01-01
    • 2015-05-05
    • 2017-09-17
    • 1970-01-01
    相关资源
    最近更新 更多