Java 仍然在UI线程上运行
我在一个新线程上运行我的RxJava观测时遇到了一个问题。我试图在Java 仍然在UI线程上运行,java,android,rx-java,rx-android,Java,Android,Rx Java,Rx Android,我在一个新线程上运行我的RxJava观测时遇到了一个问题。我试图在Scheduler.io()上运行压缩的DB查询,但不管怎样它都会阻塞UI线程。不知道为什么 数据库代码: public Observable<List<T>> searchModelsInView(View view, final Collection<String> searchTerms, KeyMatchLevel keyMatchLevel, int queryLim)
Scheduler.io()
上运行压缩的DB查询,但不管怎样它都会阻塞UI线程。不知道为什么
数据库代码:
public Observable<List<T>> searchModelsInView(View view, final Collection<String> searchTerms,
KeyMatchLevel keyMatchLevel, int queryLim) {
return Observable.just(
searchModelsTask(view, new HashSet<>(searchTerms), keyMatchLevel, queryLim));
}
它似乎应该在
调度程序.io()上运行,但它会阻止主线程,因此不会运行。问题似乎出在您的searchModelsTask中:
public Observable<List<T>> searchModelsInView(View view, final Collection<String> searchTerms,
KeyMatchLevel keyMatchLevel, int queryLim) {
return Observable.just(
searchModelsTask(view, new HashSet<>(searchTerms), keyMatchLevel, queryLim));
}
public observeable searchModelsInView(查看视图、最终集合搜索术语、,
KeyMatchLevel键匹配级别,int queryLim){
返回可观察的(
searchModelsTask(视图、新哈希集(searchTerms)、keyMatchLevel、queryLim));
}
可观察。只是希望你已经拥有了价值。因此,它在创建可观察对象之前执行searchModelsTask。因此,尝试将其放在I/O调度程序上并不重要。试着使用一个仅在内部的延迟:
public Observable<List<T>> searchModelsInView(View view, final Collection<String> searchTerms,
KeyMatchLevel keyMatchLevel, int queryLim) {
return Observable.defer(() -> Observable.just(
searchModelsTask(view, new HashSet<>(searchTerms), keyMatchLevel, queryLim)));
}
public observeable searchModelsInView(查看视图、最终集合搜索术语、,
KeyMatchLevel键匹配级别,int queryLim){
返回可观察的。延迟(()->可观察的(
searchModelsTask(视图、新哈希集(searchTerms)、keyMatchLevel、queryLim));
}
或
public observeable searchModelsInView(查看视图、最终集合搜索术语、,
KeyMatchLevel键匹配级别,int queryLim){
return Observable.defer(new Func0(){
@凌驾
公共可观测呼叫(){
返回可观察的(
searchModelsTask(视图、新哈希集(searchTerms)、keyMatchLevel、queryLim));
}
});
}
您还可以考虑使用Observable.callable代替defer。是不是setResults在subscribe块中?它是永远被阻止还是暂时被阻止getSearchResultForAll正在运行?@HansWurst它暂时被阻止。数据库查询一旦运行完毕,它就会恢复正常。@OmerOzer Aweasome:)
public Observable<List<T>> searchModelsInView(View view, final Collection<String> searchTerms,
KeyMatchLevel keyMatchLevel, int queryLim) {
return Observable.just(
searchModelsTask(view, new HashSet<>(searchTerms), keyMatchLevel, queryLim));
}
public Observable<List<T>> searchModelsInView(View view, final Collection<String> searchTerms,
KeyMatchLevel keyMatchLevel, int queryLim) {
return Observable.defer(() -> Observable.just(
searchModelsTask(view, new HashSet<>(searchTerms), keyMatchLevel, queryLim)));
}
public Observable<List<T>> searchModelsInView(View view, final Collection<String> searchTerms,
KeyMatchLevel keyMatchLevel, int queryLim) {
return Observable.defer(new Func0<Observable<List<T>>>(){
@Override
public Observable<List<T>> call() {
return Observable.just(
searchModelsTask(view, new HashSet<>(searchTerms), keyMatchLevel, queryLim));
}
});
}