Почему не запускается Firebase Task в Rx Java Completable emitter? - PullRequest
0 голосов
/ 20 апреля 2020

Я разрабатываю приложение Firebase Android, которое подключается к Firestore. Номенклатура состоит в том, что коллекция «Активы». В примере кода были простые действия, такие как addAsset и deleteAsset, которые работают нормально Это слой хранилища данных, который фактически взаимодействует с Firebase, слой модели представления находится выше этого уровня.

class FirestoreAssetRepository(secondaryDB: FirebaseFirestore) : IAssetRepository {

    companion object {
        private const val TAG = "FirestoreAssetRepo"
        private const val ASSET_COLLECTION = "Assets"
    }

    private var remoteDB: FirebaseFirestore
    private var changeObservable: Observable<List<DocumentSnapshot>>

    init {
        remoteDB = secondaryDB
    }

    override fun addAsset(asset: Asset): Completable {
        return Completable.create { emitter ->
            remoteDB.collection(ASSET_COLLECTION)
                .add(mapToAssetData(asset))
                .addOnSuccessListener {
                    if (!emitter.isDisposed) {
                        emitter.onComplete()
                    }
                }
                .addOnFailureListener {
                    if (!emitter.isDisposed) {
                        emitter.onError(it)
                    }
                }
        }
    }

    override fun deleteAsset(assetId: String): Completable {
        return Completable.create { emitter ->
            remoteDB.collection(ASSET_COLLECTION)
                .document(assetId)
                .delete()
                .addOnSuccessListener {
                    if (!emitter.isDisposed) {
                        emitter.onComplete()
                    }
                }
                .addOnFailureListener {
                    if (!emitter.isDisposed) {
                        emitter.onError(it)
                    }
                }
        }
    }

Я добавляю в хранилище действие, которое будет изменять конкретный c документ.

    override fun lockUnlockAsset(assetId: String): Completable {
        Log.d(TAG, "lockUnlockAsset")
        return Completable.create { emitter ->
            remoteDB.collection(ASSET_COLLECTION)
                .document(assetId)
                .get()
                .addOnSuccessListener {
                    Log.d(TAG, "Unlocking")
                    val remoteAsset = mapDocumentToRemoteAsset(it)
                    it.reference.update(getUnlockLocation())
                    if (!emitter.isDisposed) {
                        emitter.onComplete()
                    }
                }
                .addOnFailureListener {
                    Log.d(TAG, "Could not find asset to unlock")
                    if (!emitter.isDisposed) {
                        emitter.onError(it)
                    }
                }
        }
    }

Выполнение достигает Log.d(TAG, "lockUnlockAsset"), но никогда не достигает Log.d(TAG, "Unlocking"). Если я помещаю точку останова в эту вторую команду регистрации, это обычная красная точка в начале, но когда вызов входит в функцию, значок меняется на серый значок «не вводить», и когда я наводю на него курсор Android Студия сообщает мне, что "исполняемый файл не найден в ..." Так что там определенно что-то не так.

enter image description here

Я новичок в Kotlin и RxJava2. Как мне заставить это работать?


Обновление: чтобы ответить на вопрос Павла: эти функции вызываются из слоя ViewModel:

fun deleteAsset(assetId: String) {
    repository.deleteAsset(assetId)
        .subscribeOn(Schedulers.io())
        .subscribe(
            {},
            {
                it.printStackTrace()
            })
        .addTo(disposable)
}

fun addAsset(assetTitle: String) {
    repository.addAsset(Asset("${System.currentTimeMillis()}", assetTitle))
        .subscribeOn(Schedulers.io())
        .subscribe(
            {},
            {
                it.printStackTrace()
            })
        .addTo(disposable)
}

fun lockUnlockAsset(assetId: String) {
    repository.lockUnlockAsset(assetId)
}

Я экспериментировал с комбинациями .subscribeOn(Schedulers.io()).observe на уровне хранилища. Может быть, это .addTo(disposable), который получил это работает, я не уверен, что мне не хватало. Сейчас работает, жду от Павла его ответа.

1 Ответ

0 голосов
/ 24 апреля 2020

Я экспериментировал с комбинациями .subscribeOn(...) и observeOn(..) + .observe(...) на уровне хранилища данных, но я должен был просто следовать шаблону в модели представления (модель представления вызывает функции хранилища данных): это subscribeOn + subscribe + addTo(disposable):

fun lockUnlockAsset(assetId: String) {
    repository.lockUnlockAsset(assetId)
        .subscribeOn(Schedulers.io())
        .subscribe(
            {},
            {
                it.printStackTrace()
            })
        .addTo(disposable)
}

Спасибо Павлу за то, что указал на это.

...