Android RxScala/Java-为什么我的progressBar没有出现?

Android RxScala/Java-为什么我的progressBar没有出现?,android,rx-java,observable,rx-scala,Android,Rx Java,Observable,Rx Scala,我有一个带有SearchView的简单应用程序,用户可以根据我显示/隐藏某些视图小部件的状态进行查询。我很难找到为什么ProgressBar始终不可见。有人能说出为什么装载指示器从未出现吗 代码如下: trait MainView { def searchIntent(): Observable[String] def render(viewState: PartialMainViewState) } 演示者: class MainPresenter(...) { def b

我有一个带有
SearchView
的简单应用程序,用户可以根据我显示/隐藏某些视图小部件的状态进行查询。我很难找到为什么
ProgressBar
始终不可见。有人能说出为什么装载指示器从未出现吗

代码如下:

trait MainView {

  def searchIntent(): Observable[String]

  def render(viewState: PartialMainViewState)
}
演示者:

class MainPresenter(...) {

  def bind(mainView: MainView) = {
    val searchQueryObservable = mainView.searchIntent()
      .flatMap(s => mainInteractor.search(s))

    searchQueryObservable.observeOn(AndroidSchedulers.mainThread()).subscribe { state => mainView.render(state) }
  }
}
具有实际渲染的活动:

class SimpleActivity extends BaseSearchActivity with MainView {

  override def searchIntent(): Observable[String] = {
    Observable.defer {
      RxSearchView.queryTextChanges(vh.searchView)
        .filter((ev: CharSequence) => ev.length >= 2 || ev.length == 0)
        .debounce(500.milliseconds)
        .map[String]((ev: CharSequence) => ev.toString())
    }
  }

  override def render(viewState: PartialMainViewState): Unit =
    viewState match {
     case SearchNotStartedYet => renderSearchNotStarted()
     case Loading => renderLoading()
     case EmptyResult(_) => renderEmptyResult()
     case SearchResult(_, res) => renderResult(res)
     ...
    }

  def renderSearchNotStarted(): Unit = {
    vh.list.setVisibility(View.GONE)
    vh.progressBar.setVisibility(View.GONE)
    vh.emptyView.setVisibility(View.GONE)
  }

  def renderLoading(): Unit = {
    vh.list.setVisibility(View.GONE)
    vh.progressBar.setVisibility(View.VISIBLE)
    vh.emptyView.setVisibility(View.GONE)
  }

  def renderEmptyResult(): Unit = {
    vh.list.setVisibility(View.GONE)
    vh.progressBar.setVisibility(View.GONE)
    vh.emptyView.setVisibility(View.VISIBLE)
  }

  def renderResult(result: Array[String]): Unit = {
    vh.list.setVisibility(View.VISIBLE)
    vh.progressBar.setVisibility(View.GONE)
    vh.emptyView.setVisibility(View.GONE)
    //setting the adapter etc
  }

}
这里我正在模拟一个网络请求:

class SimpleInteractor(...) {
  def search(query: String): Observable[PartialMainViewState] = {
    Thread.sleep(1500) // to simulate "Network latency"

    if(query.isEmpty) Observable.just(SearchNotStartedYet)

    else Observable.just(persons.filter(_.toLowerCase().contains(query.toLowerCase())))
      .map(array => {
        if(array.isEmpty) EmptyResult(query) else SearchResult(query, array)
      }).+:(Loading).onErrorReturn(error => ErrorState(query, error))
  }
}

在演示者中,通过添加
subscribebeon
操作符,尝试在不同的线程上订阅:

searchQueryObservable.subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe { state => mainView.render(state) }

这使得应用程序崩溃,出现了一个
java.lang.IllegalStateException:预期会在主线程上调用,但被RxIoScheduler-2
aha,我认为这是因为源是一个UI事件。将搜索部分移到
io
thread:
.flatMap(s=>mainteractor.search(s).subscribeOn(Schedulers.io())
?调试
thread.sleep(1500)
行,看看您挂起的是哪个线程,我猜您挂起的是主线程,这就是为什么进度条没有出现的原因