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