我有一些代码,1]获取JSON文件和2]取决于该JSON文件的内容,获取另一个JSON文件。它使用ion库。
代码大致如下所示(旁注 - 此代码位于我的活动的onCreate
方法中,而e
是Exception
类型的对象):
Ion.with(applicationContext)
.load("someURL")
.asJsonObject()
.setCallback { e, result->
//Do synchronous stuff with the "result" and "e" variables
//that determines whether boolean someCondition is true or false
if(somecondition) {
Ion.with(applicationContext)
.load("https://raw.githubusercontent.com/vedantroy/image-test/master/index.json")
.asJsonObject()
.setCallback { e, result ->
//Some synchronous code in here
}
}
}
这段代码非常难看,我想改进它以摆脱嵌套。这是可能的,如果是的话,我该怎么做?
我一直在尝试,似乎我可以在.then()
之后调用方法setCallback
,其中.then()
接受一个callback
对象的参数:< / p>
Ion.with(applicationContext).load("someURL").setCallback { //Lambda Stuff }.then()
所以也许这将成为解决方案的一部分,但我不确定。
答案 0 :(得分:0)
Ion项目有一个用于Kotlin协同程序的模块:https://github.com/koush/ion/tree/master/ion-kotlin,但它似乎没有处于生产状态。幸运的是,在任何异步API和Kotlin协程之间添加自己的桥是非常简单的。
以下是如何为Ion执行此操作的示例:
private suspend fun fetchIon(url: String): String = suspendCoroutine { cont ->
Ion.with(this)
.load(url)
.asString()
.setCallback { e, result ->
if (e != null) {
cont.resumeWithException(e)
} else {
cont.resume(result)
}
}
}
现在你可以拥有这样的代码:
class MyActivity : Activity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
launch(UI) {
if (fetchIon("example.org/now") > fetchIon("example.org/deadline") {
...
}
}
}
正如您所看到的,您执行异步IO代码就像它阻塞一样。要处理错误,只需将其包装在try-catch中,就像使用任何“常规”代码一样。