当前位置: 首页 > 知识库问答 >
问题:

使Coroutine在Kotlin中等待Jsoup响应

许振海
2023-03-14
object DownloadService {

    private val parentJob = Job()
    
    ...

    private val coroutineScope = CoroutineScope(Dispatchers.Main + parentJob +
            coroutineExceptionHandler)

    fun StartService(URL: String, location:String, contx:Context) {

        coroutineScope.launch(Dispatchers.Main) {
            Log.d("action", "Start")
            val links = scrapePage(URL)
            val download = downloadImages(links, location, contx)
            Log.d("action", "End")
        }
    }

    private suspend fun scrapePage(url: String): MainActivity.Scraped =
        withContext(Dispatchers.IO) {
            var URL = url
            var scrape = MainActivity.Scraped()
            try {
                Log.d("action", "Start Scraping")
                var response = Jsoup.connect(URL).get()
                Log.d("action", "Page downloaded")
                response.getElementsByClass("link").forEach {
                    /*Scrape URLs*/
                    Log.d("action", "Add "+link)
                }
            } catch (e: Exception) {
                when(e) {
                    is HttpStatusException -> {
                        System.out.println(e.getStatusCode())
                        scrape.error = true
                        error = true
                    }
                }
            }
            return@withContext scrape
        }

    ...
}
class MainActivity : AppCompatActivity() {
    ...
    fun makeRequest(URL : String) {
        WorkingURL = URL
        var uri = ""
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
            uri = MediaStore.Downloads.EXTERNAL_CONTENT_URI.toString()
            log.text = uri
        } else {
            uri = getStoragePath()
            log.text = uri
        }
        DownloadService.StartService(URL, uri, this)
        Log.d("links", DownloadService.getError().toString())
    }
}

共有1个答案

姚和顺
2023-03-14

这里jsoup.connect(URL).get()抛出了一个错误。因此,不调用log.d(“action”,“page downloaded”)

但是,由于您正在处理异常,代码将运行catch部分并完成suspend函数,然后转到downloadimages()

解决方案

 类似资料:
  • 问题内容: PHP会以1-2秒的延迟返回值jQuery.post不等待响应。 您如何看待,是否有可能解决该问题并等待响应? 注意 与get相同的功能效果很好 问题答案: $ .post是异步的,您需要使用$ .ajax并将async设置为false,这样您就可以等待响应。您可以在此处了解更多信息: http //api.jquery.com/jQuery.ajax/

  • 问题内容: 我的页面运行着一系列命令,这些命令迫使我的PHP脚本停止更改,直到收到响应为止。我如何知道不要等待响应而只运行命令? 我正在使用一个具有后端系统的复杂命令,我可以查询该命令以检查状态,因此我不关心响应。 问题答案: 取决于您使用的平台和运行的命令。 例如,在Unix / Linux上,您可以在命令末尾追加命令,以告诉Shell释放您已启动的进程,exec将立即返回。这在Windows上

  • 问题内容: 我有一个页面,使用被称为100次(async:true)的jQuery.ajax,问题是,当它们都被加载时,我需要系统等待所有100次调用返回后才能继续。我将如何处理? 提前致谢!:) 更新: 这些调用在for()循环中进行(其中有100个:) 问题答案: 最好的方法是使用。您可以按以下方式使用它: 另外,如果您在数组中拥有所有AJAX调用,则可以使用: 请注意,这至少需要jQuery

  • 我有一个项目,我需要使用一个站点从中获取数据。所以事情是这样的:使用htmlUnit我用我的数据填充文本框,然后我按下锚,它使用ajax下载我需要的内容并动态更改超文本标记语言页面,在模态窗口中显示内容。但是在我使用锚上的. Click()后,我得到了相同的页面,没有更新,在寻找解决方案后,我在网络上发现了这个: HtmlUnit将执行Ajax调用并更新页面。请注意,与常规页面加载不同,Click

  • 我要用Dispatch写一个简单的HTTP客户端,我调用得到一个未来,调用未来得到响应 现在我想知道我怎么能等待超时。我希望最后一个API调用是: 这有意义吗? 我知道返回,它不提供带有超时的API。你建议我如何实现它?

  • 如何在此时等待3秒//等待3秒,然后继续 }