在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!")
}
}
此代码可正常使用,但看起来不像通过合并尝试来得简单。
答案 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>
)
}
}