单用流动吗?

时间:2019-01-22 21:27:03

标签: kotlin rx-java2

在rxJava2中尝试Kotlin将Single与Flowable结合使用,但没有任何反应: 不明白什么错了

@angular/cli/plugins/webpack

我的方法返回Single:

  Flowable.create<Int>({ emmit ->

            loadNewListener = object :Listener {
                override fun onEmit(id: Int) {
                    emmit.onNext(id)
                }
            }
        }, BackpressureStrategy.LATEST)
                .debounce(500, TimeUnit.MILLISECONDS)
                .flatMapSingle {
                    loadNew(id = it.id)
                }
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe({ (data:Data) ->

                }, {

                    Timber.e("Failed load data ${it.message}")
                })

我的代码有什么问题? 需要Maby在Flowable subscription()中单独调用 像这样?

private fun loadNew(id: Int): Single<Data> {

            return when (pdfType) {

                CASE_0 -> {

                    Single.create<Data> { emmit ->

             service.get("data")
                    .enqueue(
                    object : Callback<Void> {
                         override fun onFailure(call: Call<Void>?, t: Throwable?) {
                            // failure
                        }

                          override fun onResponse(call: Call<Void>?, response:  Response<Void>?) {
                 emmit.onSuccess(it.data)
            }
                        }
                    }//single
                }//case_0


                CASE_1 -> 1Repository.loadsome1Rx(id = id).map { it.getData() }

                CASE_2 -> 2Repository.loadsom2LocalRx(id = id).map { it.getData() }

                else -> {
                    throw java.lang.RuntimeException("$this is not available type!")
                }
            }

此代码可正常使用,但看起来不像通过合并尝试来得简单。

2 个答案:

答案 0 :(得分:1)

这个基于您的代码的简单示例正在工作

var i = 0
fun foo() {
    Flowable.create<Int>({ emmit ->
        emmit.onNext(i)
        i++
    }, BackpressureStrategy.LATEST)
            .debounce(500, TimeUnit.MILLISECONDS)
            .flatMapSingle {
                Single.create<String> { emmit ->
                    emmit.onSuccess("onSuccess: $it")
                }
            }
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe({
                Log.i("RX", "Subscribe: $it")
            }, {
                it.printStackTrace()
            })
}

检查SingleEmitter.onSuccess()并在所有情况下在SingleEmitter.onError()中调用when (pdfType)...

答案 1 :(得分:0)

@Stas Bondar在answer below中说过,这个基于您的代码的简单示例正在运行!

问题在loadNewListener中。

它不会及时初始化,并且在需要时为空值。在初始化ViewModel上调用create Flowable,但是当我从片段中调用他时,loadNewListener没有时间创建。

  

loadNewListener = object:Listener {...}

因为需要一些时间来初始化rxJava表达式!

通过flatMapSingle将flowable与single结合起来比在flowable dubscrinbe上调用single花费了更多的时间!

因此请使用临时字段:

class ModalDocument extends Component {
  state = {
    numPages: null
  };

  componentDidMount(numPages) {
    this.setState({numPages});
    pdfjs.GlobalWorkerOptions.workerSrc = `//cdnjs.cloudflare.com/ajax/libs/pdf.js/${pdfjs.version}/pdf.worker.js`;
  }

  onDocumentLoadSuccess = ({numPages}) => {
    this.setState({numPages});
  };

  render() {
    const {uploadPdf} = this.props.project;
    const {closeBtn} = this.props;
    return (
      <div className="darken-center-wrapper">
        {uploadPdf && uploadPdf.secure_url ? (
          <Document
            file={uploadPdf.secure_url}
            onLoadSuccess={this.onDocumentLoadSuccess}
            loading={<LoadingMessage message="Loading pdf file.."/>}
          >
            {Array.apply(null, {length: this.state.numPages}).map((val, index) => {
              return index + 1;
            }).map((pages, i) => (
              <div id={`page-${pages}`}
                   key={i}>
                <Page
                  loading={<LoadingMessage message="Loading pdf page.."/>}
                  renderAnnotationLayer={false}
                  renderTextLayer={false}
                  pageNumber={pages}
                />
              </div>
            ))
            }
          </Document>
        ) : null}
        <div onClick={closeBtn} className="close-btn">
          <img src={closeIcon} alt="close-icon"/>
        </div>
      </div>
    )
  }
}