【问题标题】:Getting Fata signal 11 when trying to use Observable尝试使用 Observable 时收到致命信号 11
【发布时间】:2017-11-18 15:36:49
【问题描述】:

我正在做一个项目,第一次尝试 Kotlin、RxJava 2 和新的 android 架构组件。我正在尝试在单独的线程上从 Room 执行删除方法,并且在执行该方法时得到ERROR: Fatal signal 11 (SIGSEGV), code 1, fault addr 0x0 in tid 12673 (RxCachedThreadS),并且强制关闭。我正在尝试这两个选项:

1.

Single.fromCallable { deviceViewModel.delete(device.phone) }
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe()

2.

Observable.just(Unit)
            .subscribeOn(Schedulers.io())
            .map { deviceViewModel.delete(device.phone) }
            .subscribe()

这是我的 DeviceViewModel.kt(使用 AndroidViewModel)

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)
}

还有我的 DeviceDao.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)

我试图解决这个问题,但没有成功。任何帮助都会到来。谢谢!

【问题讨论】:

  • 信号 11 是 SIGSEGV,分段错误。你确定你的原生库没问题?
  • @TassosBassoukos 你能更具体一点吗?如果需要,我可以向您展示我的 build.gradle
  • 信号 11 通常意味着您的进程试图访问其地址空间之外的内容,或者试图写入受保护的内存区域。这在 Java/Dalvik/ART 中是不可能的,因为它们被明确设计为安全的。最可能的原因是您正在使用 NDK 开发原生库并且那里存在错误。
  • @TassosBassoukos 我认为我没有使用任何 NDK。但是感谢您的解释
  • @AndroidRuntimeException 遇到这个问题我记不太清了,但是我会检查项目的存储库。

标签: android android-studio kotlin rx-java2 android-room


【解决方案1】:

我遇到了几乎同样的问题。我的场景是这样的:我有一个RecyclerView 列表,列表中的每个项目都有一个删除按钮。删除按钮触发了Observable,它从 Room 表中删除了该项目。同时,另一个Observable 正在观察项目表,它正在更新使用PagedList 适配器的RecyclerView

OP 暗示这可能是 cmets 中的问题,只是想确认一下:在将我的代码转换为使用 LiveData 而不是 RxJava 后,我收到一条正确的错误消息,删除项目时出现 FOREIGN KEY CONSTRAINT 失败(在我的例子中,我有另一个实体链接到被删除的实体,我将 onDelete 设置为 RESTRICT)。

由于某种原因,这个特定的错误导致 RxJava 完全崩溃,而不是返回错误消息。好像是个bug。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    • 2012-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-27
    相关资源
    最近更新 更多