Android 尝试使用Observable时收到Fata信号11
我正在做一个项目,第一次尝试Kotlin、RxJava2和新的android架构组件。我试图在单独的线程上从文件室执行一个delete方法,执行该方法时得到Android 尝试使用Observable时收到Fata信号11,android,android-studio,kotlin,rx-java2,android-room,Android,Android Studio,Kotlin,Rx Java2,Android Room,我正在做一个项目,第一次尝试Kotlin、RxJava2和新的android架构组件。我试图在单独的线程上从文件室执行一个delete方法,执行该方法时得到错误:致命信号11(SIGSEGV),代码1,tid 12673(RxCachedThreadS)中的fault addr 0x0,强制关闭。我正在尝试以下两种选择: 一, 二, 这是我的DeviceViewModel.kt(使用AndroidViewModel) 还有我的设备dao.kt @Dao abstract class Device
错误:致命信号11(SIGSEGV),代码1,tid 12673(RxCachedThreadS)中的fault addr 0x0
,强制关闭。我正在尝试以下两种选择:
一,
二,
这是我的DeviceViewModel.kt(使用AndroidViewModel)
还有我的设备dao.kt
@Dao
abstract class DeviceDao {
@Query("SELECT COUNT(*) FROM device")
abstract fun count(): Int
@Query("SELECT * FROM device")
abstract fun devices(): Flowable<List<Device>>
@Query("SELECT * FROM device WHERE phone = :p0")
abstract fun device(phone: String): Device?
fun createOrUpdate(device: Device) {
Timber.d("Device to create $device")
insertOrUpdate(device)
}
fun createTestDevice(name: String, phone: String) {
val device: Device = Device()
device.phone = phone
device.name = name
device.password = "12345"
Timber.d("Device to create $device")
insertOrUpdate(device)
}
@Insert(onConflict = OnConflictStrategy.REPLACE)
abstract fun insertOrUpdate(vararg devices: Device)
@Query("DELETE FROM device WHERE phone = :p0")
abstract fun delete(phone: String)
@Delete
abstract fun delete(device: Device)
@Dao
抽象类设备DAO{
@查询(“从设备中选择计数(*))
抽象乐趣计数():Int
@查询(“从设备中选择*)
抽象趣味设备():可流动
@查询(“从设备中选择*电话=:p0”)
抽象有趣的设备(电话:字符串):设备?
趣味createOrUpdate(设备:设备){
Timber.d(“创建$Device的设备”)
insertOrUpdate(设备)
}
fun createTestDevice(名称:String,电话:String){
val设备:设备=设备()
device.phone=电话
device.name=名称
device.password=“12345”
Timber.d(“创建$Device的设备”)
insertOrUpdate(设备)
}
@插入(onConflict=OnConflictStrategy.REPLACE)
抽象趣味插件更新(vararg设备:设备)
@查询(“从设备中删除,其中电话=:p0”)
抽象趣味删除(电话:字符串)
@删除
摘要趣味删除(设备:设备)
我试图解决这个问题,但没有成功。任何帮助都会到来。谢谢!我遇到了几乎相同的问题。我的情况是:我有一个
回收视图
列表,列表中的每个项目都有一个删除按钮。删除按钮触发了一个可观察的
,将项目从房间的桌子上删除。同时,另一个Observable
正在使用PagedList
适配器更新RecyclerView
的项目表
OP暗示这可能是评论中的问题,只是想确认一下:在将代码转换为使用LiveData而不是RxJava之后,我收到了一条正确的错误消息,这是删除项目时出现的外键约束
失败(在我的例子中,我有另一个实体链接到被删除的实体,我将onDelete
设置为RESTRICT
)
出于某种原因,这个特定的错误会导致RxJava完全崩溃,而不是返回错误消息。看起来像是一个bug。信号11是SIGSEGV,分段错误。你确定你的本机库正常吗?@TassosBassoukos你能说得更具体一点吗?我可以向你展示我的build.gradle如果需要信号11通常意味着你的进程ss试图访问其地址空间之外的内容,或试图在受保护的内存区域中写入内容。这在Java/Dalvik/ART中是不可能的,因为它们被明确设计为安全的。最可能的原因是您正在使用NDK开发本机LIB,但那里有一个bug。@Tassobassoukos我认为我没有使用任何东西NDK的ng。但是谢谢你的支持explanation@AndroidRuntimeException当我遇到这个问题时,我记不太清楚了,但我会检查项目的存储库。
Observable.just(Unit)
.subscribeOn(Schedulers.io())
.map { deviceViewModel.delete(device.phone) }
.subscribe()
class DeviceViewModel constructor(application: Application) : AndroidViewModel(application) {
@Inject lateinit var db: AppDatabase
init {
(application as KaiApplication).appComponent.inject(this)
}
fun count() = db.deviceModel().count();
fun getDevices() = db.deviceModel().devices();
fun getDevice(phone: String) = db.deviceModel().device(phone)
fun create(device: Device): Device {
db.deviceModel().createOrUpdate(device).let {
return device
}
}
fun createTestDevice(name: String, phone: String) {
db.deviceModel().createTestDevice(name, phone)
}
fun delete(device: Device): Device {
db.deviceModel().delete(device).let {
return device
}
}
fun delete(devicePhone: String) {
db.deviceModel().delete(devicePhone)
}
@Dao
abstract class DeviceDao {
@Query("SELECT COUNT(*) FROM device")
abstract fun count(): Int
@Query("SELECT * FROM device")
abstract fun devices(): Flowable<List<Device>>
@Query("SELECT * FROM device WHERE phone = :p0")
abstract fun device(phone: String): Device?
fun createOrUpdate(device: Device) {
Timber.d("Device to create $device")
insertOrUpdate(device)
}
fun createTestDevice(name: String, phone: String) {
val device: Device = Device()
device.phone = phone
device.name = name
device.password = "12345"
Timber.d("Device to create $device")
insertOrUpdate(device)
}
@Insert(onConflict = OnConflictStrategy.REPLACE)
abstract fun insertOrUpdate(vararg devices: Device)
@Query("DELETE FROM device WHERE phone = :p0")
abstract fun delete(phone: String)
@Delete
abstract fun delete(device: Device)