Tag: 异步

异步春季启动使用Kotlin无法正常工作

我正在尝试创建一个异步执行操作的Spring服务,并返回一个ListenableFuture 。 我希望在操作失败时触发失败回调 – 我尝试这样做是使用AsyncResult.forExecutionException ,如下所示: @Service open class UserClientService { @Async fun fetchUser(email: String): ListenableFuture { val uri = buildUri(email) val headers = buildHeaders() try { val result = restTemplate.exchange(uri, HttpMethod.GET, HttpEntity(headers), User::class.java) return AsyncResult.forValue(result.body) } catch (e: RestClientException) { return AsyncResult.forExecutionException(e) } } } 入门点: @SpringBootApplication @EnableAsync open class UserProxyApplication fun main(args: Array) […]

Anko的uiThread偶尔没有被解雇

我目前正在使用Anko的doAsync来处理异步任务。 具体来说,我用它来解析数据对象的ArrayList的响应json ,如下所示: // Asynchronously parse server response doAsync { val itemlist = parseResponse(response) uiThread { Otto.INSTANCE.post(UpdateRedeemedVoucherViewsEvent(itemlist)) } } 大多数情况下,就像在Google Pixel(Android 8.0.0)上一样 ,这个工作很好。 我的对象被解析,并且Otto总线事件将在ui线程上被延迟。 但在极少数情况下,这个过程失败了。 到目前为止,我注意到ui线程调用不会在Galaxy S5 Mini(Android 5.1.1)上被触发。 虽然我的数据没有任何错误或exception被解析, uiThread括号中的代码片段将不会被执行。 到目前为止,我无法确定这种行为的任何理由。 没有logcat日志,什么都没有。 这个错误将不会出现。 有没有人与kotlin和/或Anko有相同或相似的问题? 更新:我自己find了一个解决方案,请参阅下面的答案以获得解释。

如何正确显示Google房间使用的异步任务的进度

我使用Google Room来实现Android应用程序(Kotlin代码)中的数据持久性。 房间要求所有的操作(来自和来自数据库的查询)是异步的。 我希望用户等待操作执行,防止他在查询结束之前与不能正确配置的组件进行交互。 我怎么能做到这一点,因为我不能从异步任务访问UI线程? PS:我也做了一些API调用进度/加载指标是很好的。 我在这些调用中使用RxJava,但是我对这项技术相当陌生,而且我不确定如何正确地构造它。 数据库操作示例: private fun getDataFromCache() { //show progress indicator here execute({ try { //Get items from cache val entities = daoData.findAll() if (entities.isNotEmpty()) { //do something } else { //do something else } } catch (e: Exception){ Log.e(“error”, e.toString()) } finally{ //dismiss progress indicator here } }) }

Kotlin中的异步匿名函数? (lambdaexpression式)

我正在做一个列表查看什么时候点击调用函数。 I want to get function is async or sync 。 阻止什么时候是异步的。 甚至我想知道how attach async mark to kotlin lambda expression 。 class FunctionCaller_Content(text: List, val function: List Unit )? >? = null) /* I want both of async, sync function. */ { fun isAsnyc(order: Int): Boolean = // how to get this lambda expression{function?.get(order)} is […]

Kotlin挂起函数递归调用

突然发现,递归调用挂起函数需要更多的时间,然后调用相同的函数,但没有suspend修饰符,所以请考虑下面的代码片段(基本的斐波那契数列计算): suspend fun asyncFibonacci(n: Int): Long = when { n asyncFibonacci(n + 2) – asyncFibonacci(n + 1) n == -1 -> 1 n == 0 -> 0 n == 1 -> 1 n >= 2 -> asyncFibonacci(n – 1) + asyncFibonacci(n – 2) else -> throw IllegalArgumentException() } 如果我调用这个函数并用下面的代码来衡量它的执行时间: fun main(args: Array) { val totalElapsedTime […]

自己的SDK架构 – Kotlin中的异步方法API

我们正在为我们的产品构建一个公共的SDK。 它是用Kotlin和内部我们使用协程。 但是,我们想要发布一个可用于JAVA的API,这就是为什么不能提供挂起的function作为公共API。 如果Java中的可用性不如Kotlin那么舒服,那么我们也可以。 所以,例如,我们正在寻找下面的异步方法的返回types: class Sdk { fun getPlace(): ___ } 我们考虑过的事情: 使用RX Java作为接口。 我们不喜欢这个解决方案,Rx非常复杂,我们希望尽可能少地添加其他的依赖关系。 一般来说,我们会去返回单。 但是,Rx java我们不想解决的问题(哪个线程应该是已完成的工作),而Rx并不解决我们想要解决的问题(如果可能的话),例如生命周期和观察者 – Android架构组件中解决的问题。 Java 8的未来。 这似乎是最合适的,但不可能,因为我们需要针对较旧的Android(至少4.1)。 Android架构LiveData。 返回一个LiveData似乎没问题,还有一个observeForever()方法,使它可以在后台线程中使用。 另一方面,api表明它可能会重复返回多个结果。 但是,我们只希望在结果或者一个例外上忽略。 但是,在Kotlin中,我们可以实现扩展函数,这将使得它可以像sdk.getPlace().await() 。 自定义解决方案:返回一个简单的Result对象,通过提供一个回调sdk.getPlace().observe(Observe { onSucccess(data: Place) {} onFailure(e: Throwable) {} }) 我们将提供一个等待的扩展function。 问题: 我们错过了一些重要的方面/图书馆/可能性吗? 我们应该选择哪种解决方案,为什么

Kotlin过早返回乐趣

我正在尝试使用Kotlin开始Android开发。 我试图做的一部分是从我的登录活动发送一个HTTP请求,并从响应采取适当的行动。 我为此使用燃料 。 当点击“登录”按钮时,我打电话给以下fun : private fun disableInput() { username_input.isEnabled = false password_input.isEnabled = false sign_in_button.isEnabled = false login_progress.visibility = View.VISIBLE } 这工作正常。 然后我做我的HTTP请求: “http://my.login.url.com”.httpPost() .header(“Content-Type” to “application/json”) .body(json, Charsets.UTF_8) .response(AuthorizationSuccess.Deserializer()) { _, response, result -> val (auth, error) = result if (error != null || auth == null) { Snackbar.make(view, “Error”, 0).show() enableInput() […]