Я разрабатываю приложение 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 Студия сообщает мне, что "исполняемый файл не найден в ..." Так что там определенно что-то не так.
Я новичок в 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)
, который получил это работает, я не уверен, что мне не хватало. Сейчас работает, жду от Павла его ответа.