Выполняются ли облачные функции Firebase из основного потока в Android? - PullRequest
1 голос
/ 12 июля 2020

Выполняются ли облачные функции Firebase из основного потока на Android при запуске аналогично вызовам Firestore?

Для вызовов базы данных Firestore фоновая потоковая обработка обрабатывается по умолчанию.

ie Нужно ли нам использовать фоновый поток для получения данных с помощью firebase?

Клиент базы данных Firebase выполняет все сетевые и дисковые операции выкл. основной поток.

Клиент базы данных Firebase вызывает все обратные вызовы для вашего кода на основном потоке.

Таким образом, доступ к сети и диску для базы данных не являются причиной раскручивать собственные потоки или использовать фоновые задачи. Но если в обратном вызове вы выполняете операции с интенсивным использованием диска, сетевого ввода-вывода или ЦП, вам может потребоваться выполнить их самостоятельно в основном потоке. запускается в потоке IO внутри ViewModel в Android с использованием Kotlin сопрограмм и возвращается в потоке Main. Однако, если облачные функции не выполняются в основном потоке по умолчанию, flowOn(Dispatchers.IO) и withContext(Dispatchers.Main) не требуется для указания потоков.

SomeViewModel.kt

fun someMethod() {
    repository.someCloudFunction().onEach { resource ->
        withContext(Dispatchers.Main) {
            // Do something with returned resource here.
        }
    }.flowOn(Dispatchers.IO).launchIn(viewModelScope)
}

SomeRepository.kt

fun someCloudFunction(contentSelected: FeedViewEventType.ContentSelected) = flow {
    try {
        val content = contentSelected.content
        FirebaseFunctions.getInstance(firebaseApp(true))
                .getHttpsCallable("SOME_CLOUD_FUNCTION").call(
                        hashMapOf(
                                BUILD_TYPE_PARAM to BuildConfig.BUILD_TYPE,
                                CONTENT_ID_PARAM to content.id,
                                CONTENT_TITLE_PARAM to content.title,
                                CONTENT_PREVIEW_IMAGE_PARAM to content.previewImage))
                .continueWith { task ->
                    (task.result?.data as HashMap<String, String>)
                }
                // Use 'await' to convert callback to coroutine.
                .await().also { response ->
                    // Do something with response here.
                }
    } catch (error: FirebaseFunctionsException) {
        // Do something with error here.
    }
}

Expect

Явный вызов для запуска облачной функции в потоке IO и возврата ответа в Main поток можно безопасно удалить, поскольку облачная функция по умолчанию не работает в основном потоке.

SomeViewModel.kt

fun someMethod() {
    repository.someCloudFunction().onEach { resource ->
        // Do something with returned resource here.
    }.launchIn(viewModelScope)
}

Ответы [ 2 ]

2 голосов
/ 12 июля 2020

Когда вы выполняете:

FirebaseFunctions.getInstance(...).getHttpsCallable(...).call()

Вызов возвращается асинхронно, и работа по доступу к функции происходит в неосновном потоке, управляемом SDK. Вы не можете изменить это поведение, и запуск его в другой области сопрограммы на самом деле ничего не меняет.

Когда вы добавляете продолжение с помощью continueWith, по умолчанию обратный вызов выполняется в основном потоке.

Только когда вы вызовете await() в возвращенной задаче, что-либо произойдет в области сопрограммы, которую вы использовали для запуска задачи. Когда вы ждете повторных запусков, результат передается сопрограмме для дальнейшей обработки.

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

1 голос
/ 12 июля 2020

Мой ответ, который вы связали, касается клиента Firebase Realtime Database, который отделен от клиента Firebase Functions.

Тем не менее, все клиенты Firebase должны следовать одним и тем же правилам, поэтому я бы ожидал, что Функции клиент для выполнения всего сетевого ввода-вывода вне основного потока.

Разве это не то, что вы видите?

Код для Android SDK for Functions находится здесь в SDK с открытым исходным кодом.

...