问题描述
在我的代码中,一个Hero
有很多Power
。要创建Power
对象,我需要一个heroId
。在这种情况下,我试图创建一个英雄,然后赋予该英雄多个权力。
因此,HeroDao
:
@Dao
public interface HeroDao {
@Insert
Single<Long> create(Hero hero);
}
还有PowerDao
:
@Dao
public interface PowerDao {
@Insert
Completable create(Power power);
}
所以
Completable createHero(List<Power> powers) {
return heroDao.create(new Hero())
.flatMapCompletable(heroId -> Observable.fromIterable(powers)
.flatMapCompletable(power -> {
power.heroId = heroId;
return powerDao.create(power);
}))
.subscribeOn(Schedulers.io());
}
但这会引发异常:
io.reactivex.exceptions.UndeliverableException: The exception Could not be delivered to the consumer because it has already canceled/disposed the flow or the exception has Nowhere to go to begin with.
该异常还提供了一个link,它详细说明了该特定错误,但由于我是使用RxJava的经验有限的初学者,所以这些细节对我来说没有意义。
这是怎么回事?
createHero(powers)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(this::success,this::error);
解决方法
更新您的createHero()
以记录错误:
Completable createHero(List<Power> powers) {
return heroDao.create(new Hero())
// add explicit error log
.doOnError(e -> Log.e("ERROR","insert hero error",e))
.flatMapCompletable(heroId -> Observable.fromIterable(powers)
.flatMapCompletable(power -> {
power.setHeroId(heroId);
return create(power)
.doOnError(e -> Log.e("ERROR","insert power error",e))
}))
}
现在您应该看到真正引发了什么错误。