Продолжение задачи загрузки Firebase Storage никогда не срабатывает - PullRequest
0 голосов
/ 29 января 2019

Я работаю над проектом, и мне нужно загрузить изображения в хранилище Firebase и получить URL-адрес для загрузки, прежде чем я смогу загрузить соответствующий класс модели в Firestore.

Я пытаюсь использовать защелки обратного отсчета, чтобы заблокироватьОсновной поток, пока загрузка не будет завершена.Я знаю, что есть лучшие методы, и не стесняйтесь рекомендовать некоторые из них, но я решил, что смогу просто просмотреть краткий экран загрузки.Проблема в том, что обратный вызов для задачи getDownloadurl никогда не вызывается.Я искал и искал и не могу понять это.Прямо сейчас мой код прямо из документации.

fun uploadListing(listing: Listing, images: ArrayList<ByteArray>, onCompleteListener: () -> Unit = {}) {
            val listingRef = FirebaseFirestore.getInstance().collection(LISTINGS_COLLECTION).document()
            val storageRef = FirebaseStorage.getInstance().reference
            listing.id = listingRef.id
            val countDownLatch = CountDownLatch(images.size)

            var i = 0
            images.forEach {
                val imageRef = storageRef.child("images/${listing.id}/$i")
                val uploadTask = imageRef.putBytes(it)
                uploadTask.continueWithTask(Continuation<UploadTask.TaskSnapshot, Task<Uri>> { task ->
                    if (!task.isSuccessful) {
                        task.exception?.let { exception ->
                            throw exception
                        }
                    }
                    return@Continuation imageRef.downloadUrl
                }).addOnCompleteListener { task ->
                    if (task.isSuccessful) {
                        listing.images.add(task.result.toString())
                        countDownLatch.countDown()
                    } else {
                        // Handle failures
                        // ...
                    }
                }
            }
            countDownLatch.await()
            listingRef.set(listing).addOnSuccessListener {
                onCompleteListener()
            }
        }

Мои зависимости gradle ...

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    implementation 'com.android.support:design:28.0.0'
    implementation 'com.android.support:support-v4:28.0.0'
    implementation 'com.google.firebase:firebase-firestore:17.1.5'
    implementation 'com.google.firebase:firebase-storage:16.0.5'
    implementation 'com.google.firebase:firebase-auth:16.1.0'
    implementation 'com.google.firebase:firebase-core:16.0.6'
    implementation 'com.squareup.picasso:picasso:2.5.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
//    implementation 'org.elasticsearch.client:elasticsearch-rest-high-level-client:6.5.3'
    implementation 'com.google.code.gson:gson:2.8.5'
}

1 Ответ

0 голосов
/ 30 января 2019

Никогда не блокируйте основной поток.Обычно это ужасная идея (как вы только что обнаружили), которая может привести к сбою вашего приложения с ANR.

Если вы хотите зарегистрировать другой обратный вызов, когда куча задач завершена, используйте один из вариантов Tasks.whenAll () и передайте ему все задачи, которые вы хотите выполнить, прежде чем переходить к следующему элементу работы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...