Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/202.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Anko doAsync调用未执行_Java_Android_Android Studio_Asynchronous_Kotlin - Fatal编程技术网

Java Anko 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 在主线程上执行调

我在androidstudio中创建了一个项目,目前正在使用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()
                }
            }
        }
    }

代码跳转到
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块中以捕获异常例外