gpt4 book ai didi

android - 需要 RXJava 异步帮助。输入被调用阻塞

转载 作者:行者123 更新时间:2023-11-30 01:47:32 26 4
gpt4 key购买 nike

我有下面的代码,可以很好地在 ListView 中显示结果。问题是打字时调用会阻塞键盘,但是当我尝试订阅 io 线程时它不起作用。我的问题是:调用我的休息接口(interface)的正确位置在哪里?

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

}
});

最佳答案

我的猜测是 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(...));

关于android - 需要 RXJava 异步帮助。输入被调用阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33504638/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com