Anko doAsync通话未执行

时间:2018-06-20 15:04:30

标签: java android android-studio asynchronous kotlin

我正在Android Studio中创建一个项目,并正在使用Anko库在单独的线程上运行API请求。当UI线程传递数据并启动下一个活动时,该线程只是进行HTTP GET调用并解析数据。

问题是,我的程序似乎从未进入doAsync块。我在下面为我为该调用编写的函数发布了代码,单击按钮即会调用该函数,单击该按钮时什么也没有发生。它不会停止,不会崩溃,什么也不会。活动的其他部分甚至会响应。

我尝试过的解决方案:

  • 调试进入该块,只需跳过它
  • 删除try / catch
  • 在主线程上进行调用和解析(引发异常)
  • 将呼叫放置在一个单独的函数中(原来是在按钮侦听器中)

我在网上找不到任何真正的东西,因此欢迎您提供任何帮助。

MainActivity.kt

    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()
                }
            }
        }
    }

1 个答案:

答案 0 :(得分:2)

由于无法在尚未调用Looper.prepare()的线程上catch,所以代码正在跳入toast块。解决方案将称为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()
            }
        }
    }
}