如果你有一个大的Observable图(即使用merge
,groupBy
,join
等多次编写可观察图形,并且抛出异常,有时很难计算出来出异常的地方。我想知道是否有可能找到源文件中Observable操作符的位置。一个例子应该让这个更清楚。
例如,给定以下IllegalStateException: Only one subscriber allowed!
和堆栈跟踪,我想知道是否可以找出行号operatorMerge
,operatorFilter
,{{在我的源文件中引发了1}}等。是否可以通过使用调试器,打印语句或其他方式以某种方式执行此操作?
operatorGroupBy
出现这个问题主要是因为Observable的整个要点是在执行时将a)代码与b)分离。但是对于调试程序来说,这是一场噩梦。因此,重复我上面的问题,我想知道是否可以在源代码中跟踪每个作文的原始行。
答案 0 :(得分:1)
有一些关于额外调试信息的实验,但整个库运行速度慢100倍并被放弃。
问题很可能发生在你的groupBy之后的flatMap中,你订阅GroupedObservable并将其交还给现在无法订阅的flatMap:GroupedObservable只能被使用一次。您需要使用其中一个publish()
或replay()
运算符并相应地调整函数逻辑。
答案 1 :(得分:0)
一年后,我仍然在努力解决这个问题,但仍未找到追踪执行情况的好方法。我发现我依赖于在代码中放置print语句来查看正在发生的事情。这是我能够了解正在发生的事情的唯一方法。
我发现唯一有用的是为此创建一个模式,所以我不必写doOnNext(x => println(x))
来显示每次发生的事情:
implicit class ObservableTrace[T](o : rx.lang.scala.Observable[T]) {
import java.time.LocalTime
def trace(name : String) : rx.lang.scala.Observable[T] = {
def print(s: String) = println(s"${LocalTime.now} : $name : $s")
(o doOnNext (x => print("next:" + x))
doOnSubscribe print("subscribed")
doOnCompleted print("completed")
doOnError (e => print("error: " + e))
doOnUnsubscribe print("unsubscribed")
)
}
这样可以快速编辑代码 - 只需在几个observable上编写myobservable.trace("My Observable")
,这样就可以很容易地看到不同的生命周期事件发生的时间。