Java Anko doAsync调用未执行
我在androidstudio中创建了一个项目,目前正在使用Anko库在一个单独的线程上运行API请求。当UI线程传递所述数据并开始下一个活动时,所述线程只是进行HTTP GET调用并解析数据 问题是,我的程序似乎从未进入doAsync块。我已经在下面发布了我为调用编写的函数的代码,它是在单击按钮时调用的,当所述按钮被单击时,不会发生任何事情。它不会失速,不会崩溃,什么都没有。活动的其他部分甚至会做出反应 我尝试过的解决方案:Java Anko doAsync调用未执行,java,android,android-studio,asynchronous,kotlin,Java,Android,Android Studio,Asynchronous,Kotlin,我在androidstudio中创建了一个项目,目前正在使用Anko库在一个单独的线程上运行API请求。当UI线程传递所述数据并开始下一个活动时,所述线程只是进行HTTP GET调用并解析数据 问题是,我的程序似乎从未进入doAsync块。我已经在下面发布了我为调用编写的函数的代码,它是在单击按钮时调用的,当所述按钮被单击时,不会发生任何事情。它不会失速,不会崩溃,什么都没有。活动的其他部分甚至会做出反应 我尝试过的解决方案: 调试要进入块,只需跳过它 删除try/catch 在主线程上执行调
- 调试要进入块,只需跳过它
- 删除try/catch
- 在主线程上执行调用和分析(引发异常)
- 将调用放在一个单独的函数中,就像现在一样(最初是在按钮侦听器中)
private
fun asyncCall(n : Int) {
doAsync {
try {
// Call API, store Place objects in placesList
toast("streamJSON call")
placesList = streamJSON()
} catch (e: java.lang.RuntimeException) {
// Error parsing JSON
toast("Invalid Request")
}
uiThread {
if(n == 1) { // Submit button
goToResults()
}
else if (n == 2) { // Feeling lucky button
feelingLuckyAlert()
}
}
}
}
代码跳转到
catch
块中,因为您无法对未调用Looper.prepare()的线程执行toast
。解决方案是在uiThread
private fun asyncCall(n : Int) {
doAsync {
try {
uiThread {
toast("streamJSON call")
}
// Call API, store Place objects in placesList
placesList = streamJSON()
} catch (e: java.lang.RuntimeException) {
uiThread {
toast("Invalid Request")
}
}
uiThread {
if(n == 1) { // Submit button
goToResults()
} else if (n == 2) { // Feeling lucky button
feelingLuckyAlert()
}
}
}
}
您是否使用
await
尝试了CountDownLatch
,以及在哪里调用asyncCall
函数?我没有,我认为我不需要,因为我觉得这相当简单。我从onCreate()方法中的两个按钮的点击监听器调用它。我认为这可能是问题所在,但我不认为我可以将上述侦听器从onCreate()中去掉。哦,我想问题在于您的toast
需要在uiThread
中,您是否尝试过在doAsync
中调试它?我添加了这些侦听器来调试它,因此它应该可以在没有它们的情况下运行,这难道不会引发某种异常或其他情况吗?我试过调试它,只是跳过了块。试过了,它成功了,有没有一种方法可以让它在抛出一个错误时,从doAsync块中跳出并显示错误?我想你可以这样做return@doAsync
在出错时从doAsync块返回,或者您也可以从内部抛出
异常,并将doAsync
块放入try-catch块中以捕获异常例外