Java Android中的Jsoup速度

Java Android中的Jsoup速度,java,android,kotlin,jsoup,html-parsing,Java,Android,Kotlin,Jsoup,Html Parsing,我正在尝试在应用程序中显示librivox书籍的图像列表。由于librivoxapi不提供书籍图像的url,我必须通过抓取书籍的html页面来获取它们。下面的方法有效,但速度太慢(50本书的结果大约需要30秒)。有没有更好(更快)的方法来实现这一点 以下是我在ViewModel中的方法: fun searchBooks(searchInput: String) { coroutineScope.launch { val deferredSearchResult = Bo

我正在尝试在应用程序中显示librivox书籍的图像列表。由于librivoxapi不提供书籍图像的url,我必须通过抓取书籍的html页面来获取它们。下面的方法有效,但速度太慢(50本书的结果大约需要30秒)。有没有更好(更快)的方法来实现这一点

以下是我在ViewModel中的方法:

fun searchBooks(searchInput: String) {
    coroutineScope.launch {

        val deferredSearchResult = BookApi.retrofitService.getSearchResult(searchInput)
        val bookData = deferredSearchResult.await().books
        _listBooks.postValue(bookData.toBookItem())

    }
}

private fun List<Book>.toBookItem(): List<BookItem> {

    val bookList = mutableListOf<BookItem>()
    this.forEach {

        val imgUrl = Jsoup.connect(it.url_librivox).get()
                .select("img")
                .get(1)
                .absUrl("src")

        Log.v(LOG_TAG, "imgUrl is $imgUrl")


        val bookAuthors: MutableList<String> = it.authors.map {
            it.first_name + "" + it.last_name
        }.toMutableList()

        bookList.add(BookItem(
            it.title,
            bookAuthors.toString(),
            it.url_librivox,
            imgUrl
        ))
    }

    return bookList
}
fun searchbook(searchInput:String){
协同观测发射{
val deferredSearchResult=BookApi.reformationservice.getSearchResult(searchInput)
val bookData=deferredSearchResult.await().books
_listBooks.postValue(bookData.toBookItem())
}
}
private fun List.toBookItem():List{
val bookList=mutableListOf()
这是forEach{
val imgUrl=Jsoup.connect(it.url_librivox.get())
.选择(“img”)
.get(1)
.absUrl(“src”)
Log.v(Log_标签,“imgUrl是$imgUrl”)
val bookAuthors:MutableList=it.authors.map{
it.first\u name+“”+it.last\u name
}.toMutableList()
bookList.add(图书项目)(
它的名字,
bookAuthors.toString(),
it.url_librivox,
伊姆古尔
))
}
归还书目
}

这个网站似乎速度太慢了

尝试进入页面源,会出现如下相对URL:

/app.php/feed?sid=

它可以很容易地与主机预先设置以获得

看起来会话ID甚至不用于限制访问,因此您可以继续并删除查询参数以获取:

-装载速度相当快(相对而言)


上面我看不到您试图使用什么URL来获取图书图像,因此很难建议是否有更好的URL可使用

coroutineScope。launch
将在主线程上调用它。添加一个调度程序,如
coroutineScope.launch(Dispatchers.IO)
。如果线程正常,我已经完成了
val coroutineScope=coroutineScope(viewModelJob+Dispatchers.IO)
ok。您正在For循环内调用
Jsoup.connect
。如果列表大小超过一个,这将需要时间。难道没有一种方法可以让你在一次点击中获得所有书籍的细节吗?如果没有,那么最好为每本书单独调用no-in循环。不幸的是,我必须在循环中调用
Jsoup.connect
,因为正如我在上面提到的librivox api不提供图像url列表,我必须获取每本书的url,解析html并获取图像url。我想我可以通过为同一个任务使用多个线程来解决这个问题,但不确定我如何不阅读kotlin,我不喜欢kotlin(但我在Java工具中使用web抓取)。。。嗯,请问RESTAPI的URL是什么?我知道用Java下载图像可能会很慢,而下载50幅图像之前就造成了内存泄漏。是否可以在不调用JSoup下载页面的情况下计算/计算出
图像URL
?如果我有一些实际的地址可以使用,我可以更好地回答这个问题(但在Java中,因为我基本上是Kotlin文盲)。我使用这个url获取指定搜索词({searchInput})的搜索结果,然后使用Jsoup从librivox页面中为返回结果中的每本书提取图像url(例如)。我使用Glide从提取的url下载图像(例如)。