Java 仍然在UI线程上运行

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)

我在一个新线程上运行我的RxJava观测时遇到了一个问题。我试图在
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));
        }
    });
}