android– 在运行主线程时对Cloud Firestore进行同步调用

android– 在运行主线程时对Cloud Firestore进行同步调用,第1张

概述我正在构建一个基于AndroidCleanArchitectureKotlin版本(https://github.com/android10/Android-CleanArchitecture-Kotlin)的应用程序.使用此体系结构,每次要调用用例时,都会启动Kotlin协程,并将结果发布到主线程中.这是通过以下代码实现的:abstractclassUseCase<outType,

我正在构建一个基于Android Clean Architecture Kotlin版本(https://github.com/android10/Android-CleanArchitecture-Kotlin)的应用程序.

使用此体系结构,每次要调用用例时,都会启动Kotlin协程,并将结果发布到主线程中.这是通过以下代码实现的:

abstract class UseCase<out Type, in Params> where Type : Any {abstract suspend fun run(params: Params): Either<Failure, Type>fun execute(onResult: (Either<Failure, Type>) -> Unit, params: Params) {    val job = async(CommonPool) { run(params) }    launch(UI) { onResult.invoke(job.await()) }}

在他的示例架构中,Android10先生使用Retrofit在kotlin couroutine中进行同步API调用.例如:

overrIDe fun movIEs(): Either<Failure, List<MovIE>> {            return when (networkHandler.isConnected) {                true -> request(service.movIEs(), { it.map { it.toMovIE() } }, emptyList())                false, null -> left(NetworkConnection())            }        }private fun <T, R> request(call: Call<T>, transform: (T) -> R, default: T): Either<Failure, R> {            return try {                val response = call.execute()                when (response.isSuccessful) {                    true -> Right(transform((response.body() ?: default)))                    false -> left(ServerError())                }            } catch (exception: Throwable) {                left(ServerError())            }        }

‘Either’表示不相交的类型,意味着结果将是失败或您想要的类型T的对象.

他的service.movi​​es()方法实现如此(使用改造)

@GET(MOVIES) fun movIEs(): Call<List<MovIEEntity>>

现在这是我的问题.我正在用Google Cloud Firestore取代改造.我知道目前,Firebase / Firestore是一个全异步库.我想知道是否有人知道一种更优雅的方法来对Firebase进行同步API调用.

我实现了自己的Call版本:

interface Call<T: Any> {    fun execute(): Response<T>    data class Response<T>(var isSuccessful: Boolean, var body: T?, var failure: Failure?)}

 我的API调用在这里实现

overrIDe fun movIEList(): Call<List<MovIEEntity>> = object : Call<List<MovIEEntity>> {        overrIDe fun execute(): Call.Response<List<MovIEEntity>> {            return movIEListResponse()        }    }    private fun movIEListResponse(): Call.Response<List<MovIEEntity>> {        var response: Call.Response<List<MovIEEntity>>? = null        FirebaseFirestore.getInstance().collection(DataConfig.databasePath + MOVIES_PATH).get().addOnCompleteListener { task ->            response = when {                !task.isSuccessful -> Call.Response(false, null, Failure.ServerError())                task.result.isEmpty -> Call.Response(false, null, MovIEFailure.ListNotAvailable())                else -> Call.Response(true, task.result.mapTo(ArrayList()) { MovIEEntity.fromSnapshot(it) }, null)            }        }        while (response == null)            Thread.sleep(50)        return response as Call.Response<List<MovIEEntity>>    }

当然,最后的while循环困扰着我.还有其他更优雅的方法,等待在从movIEListResponse方法返回之前分配响应吗?

我尝试在从Firebase get()方法返回的Task上调用await(),但无论如何,movIEListResponse方法都会立即返回.谢谢您的帮助!

解决方法:

所以我在Google Tasks API中找到了我想要的东西:“如果你的程序已经在后台线程中执行,你可以阻止任务同步获得结果并避免回调”https://developers.google.com/android/guides/tasks#blocking

所以我以前的问题代码变成了:

private fun movIEListResponse(): Call.Response<List<MovIEEntity>> {        return try {            val taskResult = Tasks.await(FirebaseFirestore.getInstance().                    collection(DataConfig.databasePath + MOVIES_PATH).get(), 2, TimeUnit.SECONDS)            Call.Response(true, taskResult.mapTo(ArrayList()) { MovIEEntity.fromSnapshot(it) }, null)        } catch (e: ExecutionException) {            Call.Response(false, null, Failure.ServerError())        } catch (e: InterruptedException) {            Call.Response(false, null, Failure.InterruptedError())        } catch (e: TimeoutException) {            Call.Response(false, null, Failure.TimeoutError())        }    }

注意我不再需要我的Thread.sleep while循环.
此代码应仅在后台线程/ kotlin协程中运行.

总结

以上是内存溢出为你收集整理的android – 在运行主线程时对Cloud Firestore进行同步调用全部内容,希望文章能够帮你解决android – 在运行主线程时对Cloud Firestore进行同步调用所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1104733.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存