链式调用android中Rxjava中的异常(RxJavaAssemblyException:Assembly)
我正在用RxJava做一个调用。我可能在通话中使用了太多的锁链。有如此多的可观察和转换,我担心集合丢失了。不幸的是,我需要使用这些函数。我这里有一个方法,我在片段中调用它。当我调试并设置断点时,该方法永远不会被调用 在我的片段中,我在这里调用offlineItems(): 我绝对不是RxJava专家,所以如果有人能指出我做错了什么 编辑 堆栈跟踪:链式调用android中Rxjava中的异常(RxJavaAssemblyException:Assembly),android,rx-java,chaining,Android,Rx Java,Chaining,我正在用RxJava做一个调用。我可能在通话中使用了太多的锁链。有如此多的可观察和转换,我担心集合丢失了。不幸的是,我需要使用这些函数。我这里有一个方法,我在片段中调用它。当我调试并设置断点时,该方法永远不会被调用 在我的片段中,我在这里调用offlineItems(): 我绝对不是RxJava专家,所以如果有人能指出我做错了什么 编辑 堆栈跟踪: RxJavaAssemblyException: assembled at dalvik.system.VMStack.getThreadStack
RxJavaAssemblyException: assembled
at dalvik.system.VMStack.getThreadStackTrace(Native Method)
at io.reactivex.Observable.map(Observable.java:9781)
at DownloadsFragment.streamDownloads(DownloadsFragment.kt:143)
at DownloadsFragment.onResume(DownloadsFragment.kt:128)
at androidx.fragment.app.Fragment.performResume(Fragment.java:2649)
at androidx.fragment.app.FragmentManagerImpl.moveToState
at FragmentManagerImpl.moveFragmentToExpectedState
at FragmentManagerImpl.moveToState(FragmentManagerImpl.java:1303)
at FragmentManagerImpl.dispatchStateChange(FragmentManagerImpl.java:2659)
at FragmentManagerImpl.dispatchResume(FragmentManagerImpl.java:2625)
at androidx.fragment.app.Fragment.performResume(Fragment.java:2658)
at FragmentManagerImpl.moveToState(FragmentManagerImpl.java:922)
at FragmentManagerImpl.moveFragmentToExpectedState
at FragmentManagerImpl.moveToState(FragmentManagerImpl.java:1303)
at FragmentManagerImpl.executeOpsTogether(FragmentManagerImpl.java:1884)
at FragmentManagerImpl.removeRedundantOperationsAndExecute
at FragmentManagerImpl.execPendingActions(FragmentManagerImpl.java:1727)
at FragmentManagerImpl$2.run(FragmentManagerImpl.java:150)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
您是否使用RxJavaExtensions中的RxJavaAssemblyTracking?如果是这样,没有AssemblyTracking,StackTrace会是什么样子?@HansWurst是的,我是。没有它,我就没有堆栈跟踪。这是完整的堆栈跟踪吗?我找不到实际的堆栈帧。我试图复制它,但到目前为止,我在这方面运气不太好。当您禁用程序集跟踪时,在onResume()方法的subscribe中是否会出现OnErrorNotImplementException,或者它只是以静默方式失败?@HansWurst只是以静默方式失败。我也只是偶尔得到堆栈跟踪,这是我通过调试发现的。Logcat或Debug console.method offlineItems中没有任何内容。您应该将所有代码放入链中,而不是像这样调用。使返回可见。fromCallable{getAllMyDownloadedMediaItems()}。FlatMapetable。。。
fun offlineItems(): Observable<List<MediaItem>> {
val list = getAllMyDownloadedMediaItems()
return list.flatMapIterable { it }
.flatMap { mediaStore.getMediaItemWithId(MediaId(it.request.id)) } // this method is called .
.toList() // returns an Observable<MediaItem>
.toObservable()
}
override fun getMediaItemWithId(mediaId: MediaId): Observable<MediaItem> {
return if (isOnline()) {
Observable.just(Unit)
.effectMap { fetchAndStoreRemote(mediaId) }
.flatMap { mediaItemFromDB(mediaId) }
} else {
mediaItemFromDB(mediaId)
}
}
fun getAllMyDownloadedMediaItems(): Observable<List<Download>> {
return Observable.just(downloadManager.downloadIndex.getDownloads(Download.STATE_COMPLETED).use { index ->
mutableListOf<Download>().apply {
if (index.isFirst || index.moveToFirst()) {
do {
add(index.download)
} while (index.moveToNext())
}
}
})
}
private fun downloadLoaded(downloads: List<MediaItem>) {
if (downloads.isEmpty()) {
downloadStateView.setState(StateView.State.EMPTY)
} else {
downloadStateView.setState(StateView.State.CONTENT)
episodeAdapter.items = listOf(Header(downloads.size)) + downloads.map(::Item)
}
}
override fun onResume() {
super.onResume()
Observable.merge(
streamDownloads(),
handleEmptyAction()
).autoDispose(this)
.subscribe()
}
RxJavaAssemblyException: assembled
at dalvik.system.VMStack.getThreadStackTrace(Native Method)
at io.reactivex.Observable.map(Observable.java:9781)
at DownloadsFragment.streamDownloads(DownloadsFragment.kt:143)
at DownloadsFragment.onResume(DownloadsFragment.kt:128)
at androidx.fragment.app.Fragment.performResume(Fragment.java:2649)
at androidx.fragment.app.FragmentManagerImpl.moveToState
at FragmentManagerImpl.moveFragmentToExpectedState
at FragmentManagerImpl.moveToState(FragmentManagerImpl.java:1303)
at FragmentManagerImpl.dispatchStateChange(FragmentManagerImpl.java:2659)
at FragmentManagerImpl.dispatchResume(FragmentManagerImpl.java:2625)
at androidx.fragment.app.Fragment.performResume(Fragment.java:2658)
at FragmentManagerImpl.moveToState(FragmentManagerImpl.java:922)
at FragmentManagerImpl.moveFragmentToExpectedState
at FragmentManagerImpl.moveToState(FragmentManagerImpl.java:1303)
at FragmentManagerImpl.executeOpsTogether(FragmentManagerImpl.java:1884)
at FragmentManagerImpl.removeRedundantOperationsAndExecute
at FragmentManagerImpl.execPendingActions(FragmentManagerImpl.java:1727)
at FragmentManagerImpl$2.run(FragmentManagerImpl.java:150)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)