【发布时间】: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