我写了这个简单的测试程序:
fun main() {
println("Main Start")
thread {
println("Thread Start")
Thread.sleep(3000)
println("Thread End")
}
println("Main End")
}
Run Code Online (Sandbox Code Playgroud)
正如我所看到的,输出是:
Main Start
Main End
Thread Start
Thread End
Run Code Online (Sandbox Code Playgroud)
我的期望是至少不会打印“线程结束”消息,因为主函数已结束并且该主线程应该完成运行。
Kotlin 进程是否总是在完成之前等待线程完成?
我目前正在开发一些基本的应用程序,我尝试从 API - 对象列表中获取响应。
我的数据类是:
@JsonClass(generateAdapter = true)
data class Tag(
@Json(name = "id")
val id: Int,
@Json(name = "name")
val name: String
)
@JsonClass(generateAdapter = true)
data class Test(
@Json(name = "count")
val count: Int,
@Json(name = "next")
val next: Int,
@Json(name = "previous")
val previous: Int,
@Json(name = "results")
val results: List<Tag>
)
Run Code Online (Sandbox Code Playgroud)
我的改造构建代码是:
val moshi = Moshi.Builder()
.add(KotlinJsonAdapterFactory())
.build()
return Retrofit.Builder()
.baseUrl(SERVER_BASE_URL)
.addCallAdapterFactory(CoroutineCallAdapterFactory())
.addConverterFactory(MoshiConverterFactory.create(moshi))
.build()
Run Code Online (Sandbox Code Playgroud)
而我的要求也很简单:
@GET("api/tags")
suspend fun getTags(): Deferred<Test>
Run Code Online (Sandbox Code Playgroud)
但是当我打电话时getTags()出现以下错误:
java.lang.IllegalArgumentException: Unable to …Run Code Online (Sandbox Code Playgroud) 我最近检查了 livedata 协程,发现了一些我无法理解的东西。为什么这段代码(观察时)没有冻结 UI?
val lv =
liveData (context=Dispatchers.Main){
var x = 0
while (true){
emit(x++)
delay(1000)
println(Thread.currentThread().name)
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢。