Получение сигнала Fata 11 при попытке использовать Observable

Я работаю над проектом, впервые пробуя Kotlin, RxJava 2 и новые компоненты архитектуры Android. Я пытаюсь выполнить метод удаления из комнаты в отдельном потоке, и я получаю 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)

Я пытался решить это, но безуспешно. Любая помощь не помешала бы. Спасибо!


person Josue Mavarez    schedule 16.06.2017    source источник
comment
Сигнал 11 — SIGSEGV, ошибка сегментации. Вы уверены, что ваши родные библиотеки в порядке?   -  person Tassos Bassoukos    schedule 16.06.2017
comment
@TassosBassoukos, не могли бы вы быть более конкретным? Я могу показать вам свой build.gradle, если это необходимо.   -  person Josue Mavarez    schedule 16.06.2017
comment
Сигнал 11 обычно означает, что ваш процесс пытался получить доступ к чему-то за пределами своего адресного пространства или пытался записать в защищенную область памяти. Это не должно быть возможно из-под Java/Dalvik/ART, поскольку они явно предназначены для обеспечения безопасности. Наиболее вероятная причина в том, что вы используете NDK для разработки собственных библиотек, и там есть ошибка.   -  person Tassos Bassoukos    schedule 16.06.2017
comment
@TassosBassoukos Я не думаю, что использую что-либо из NDK. Но спасибо за объяснение   -  person Josue Mavarez    schedule 16.06.2017
comment
Я тоже только что получил: Fatal signal 11 (SIGSEGV), code 1, fault addr 0x0 in tid 29799 (RxCachedThreadS) с использованием RxJava 2.1.2, RxAndroid 2.0.1, kotlin_version = '1.1.51'   -  person Someone Somewhere    schedule 17.10.2017
comment
Вы нашли решение для этого?   -  person AndroidRuntimeException    schedule 22.05.2018
comment
@AndroidRuntimeException Да, я думаю. Оказывается, мне не хватало внешней связи между двумя таблицами, это то, что я помню.   -  person Josue Mavarez    schedule 22.05.2018
comment
@JosueMavarez Странно то, что я не использую область или базу данных.   -  person AndroidRuntimeException    schedule 22.05.2018
comment
@AndroidRuntimeException Я мало что помню, когда сталкиваюсь с этой проблемой, но я проверю репозиторий проекта.   -  person Josue Mavarez    schedule 22.05.2018


Ответы (1)


У меня была примерно такая же проблема. Мой сценарий был таким: у меня был список RecyclerView, и у каждого элемента в списке была кнопка удаления. Кнопка удаления активировала Observable, которая удалила элемент из таблицы Room. В то же время за таблицей элементов наблюдал другой Observable, который обновлял RecyclerView, использующий адаптер PagedList.

ОП намекнул, что это может быть проблемой в комментариях, просто хотел подтвердить: после преобразования моего кода для использования LiveData вместо RxJava я получил правильное сообщение об ошибке, которое было ошибкой FOREIGN KEY CONSTRAINT при удалении элемента (в моем случае я была другая сущность, которая была связана с удаляемой сущностью, и я установил onDelete на RESTRICT).

По какой-то причине эта конкретная ошибка заставляет RxJava совершенно сходить с ума, вместо того, чтобы возвращать сообщение об ошибке. Похоже на ошибку.

person James Allen    schedule 24.06.2019