Tag: 异步

@DataJpaTest和@Async CRUDRepository方法不能一起工作

我目前使用spring-boot作为@Async实现了一些存储库方法,当我实际启动应用程序时,它的工作方式应该是这样,但是在运行集成测试时,事情开始变得很奇怪。 我已经设置了一个展示问题的小项目。 库: interface MyObjectRepository : CrudRepository<MyObject, Long> { @Async fun findBySomething(something: String): ListenableFuture<MyObject?> } 应用: @SpringBootApplication @EnableAsync class Application { private val log = LoggerFactory.getLogger(Application::class.java) } fun main(args: Array<String>) { SpringApplication.run(Application::class.java, *args) } 而我的测试案例: @RunWith(SpringRunner::class) @DataJpaTest class MyObjectRepositoryTest { @Autowired lateinit var target: MyObjectRepository @Before fun `init`() { target.deleteAll() } @Test fun `should be […]

协程异常处理程序为什么使原始异常加倍?

我实现了我自己的async ,我不能以正确的方式处理异常。 为什么? val expected = IllegalStateException(); val it = async<Any> { throw expected; }; assert.that({ it.get() }, throws(equalTo(expected))); // ^— but it throws a IllegalStateException(cause = expected) 源代码 interface Response<in T> { suspend fun yield(value: T); } interface Request<out T> { fun get(): T; fun <R> then(mapping: (T) -> R): Request<R>; } private val […]

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

我们正在为我们的产品构建一个公共的SDK。 它是用Kotlin和内部我们使用协程。 但是,我们想要发布一个可用于JAVA的API,这就是为什么不能提供挂起的功能作为公共API。 如果Java中的可用性不如Kotlin那么舒服,那么我们也可以。 所以,例如,我们正在寻找下面的异步方法的返回类型: 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) {} }) 我们将提供一个等待的扩展功能。 问题: 我们错过了一些重要的方面/图书馆/可能性吗? 我们应该选择哪种解决方案,为什么

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() […]

协程只是完成句柄的语法糖?

协程只是完成块周围的语法糖,完成块将在引擎盖下创建? 或者,协程的概念更为复杂和广泛,只是编译器把戏又称为语法糖

API调用不能在Anko Async中使用

我正在尝试使用Kotlin在Android中发出一个http请求,而且我遇到了两种这样做的方法。 一个是传统的方式,使用AsyncTask (不是很漂亮),我得到了下面的代码(只是doInBackground ,因为其余的类似乎是不必要的): override fun doInBackground(vararg params: Void?): String? { val url = URL("myUrl") val httpClient = url.openConnection() as HttpURLConnection if(httpClient.getResponseCode() == HttpURLConnection.HTTP_OK){ try { val stream = BufferedInputStream(httpClient.getInputStream()) val data: String = readStream(inputStream = stream) return data; } catch (e : Exception) { e.printStackTrace() } finally { httpClient.disconnect() } }else{ println("ERROR ${httpClient.getResponseCode()}") } […]

Android:运行4个异步任务(与Rest API一起工作),完成所有任务后等待并启动另一个任务

我有一些异步任务的问题。 我试图运行从last.fm休息API获取数据的4个异步任务。 我的任务是: 运行4个任务(计数无关紧要,但必须大于1)异步或并行 从last.fm rest api获取数据(用于从last.fm api获取数据,我使用了de.umass.lastfm java库) 等待完成所有任务 用获取的数据开始另一个活动 调用异步任务的函数: <pre>override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_animation) initViewElements(); mArtistName = intent.getStringExtra("ARTIST_NAME"); Log.i(TAG, mArtistName); setAnimationData(); getArtistData(mArtistName); startActivity(Intent(this, DetailsActivity::class.java)) }</pre> 功能介绍了我的任务 <pre> private fun getArtistData(name: String) { val getArtistDataAsync = object : AsyncTask<String, Void, Artist>() { override fun doInBackground(vararg args: String?): Artist? { return Artist.getInfo(args[0], […]

我可以混合Ktor与暴露?

我正在写一个服务使用Ktor和暴露ORM显然不是异步。 我来自Python世界,在那里使用阻塞ORM与异步IO库是一个罪过,因为它可能会阻止线程中的所有用户。 Kotlin也适用同样的规则吗? 我是否创建了一个糟糕的建筑?

在Kotlin协同程序中启动/连接和异步/等待之间有什么区别?

在kotlinx.coroutines库中,您可以使用launch (使用kotlinx.coroutines )或async (使用await )来启动新协程。 他们有什么区别?

协程的行为是否正确?

我开始kotlin,不知道我已经正确实施了kotlin协程的生产者和消费者模式 ? @RestrictsSuspension interface Producer<in T> { suspend fun yield(value: T); } fun <T> produce(context: CoroutineContext = EmptyCoroutineContext, building: suspend Producer<T>.() -> Unit): Supplier<T> { val (NOT_READY, READY, DONE) = arrayOf(-1, 2, 3); val producer = object : Producer<T>, Continuation<Unit>, Supplier<T> { var value: T? = null; var step: Continuation<Unit>? = null; var state: Int […]