优化
This commit is contained in:
@@ -33,6 +33,7 @@ import kotlinx.coroutines.flow.map
|
|||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
import splitties.init.appCtx
|
import splitties.init.appCtx
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
import java.util.concurrent.ConcurrentHashMap
|
||||||
import java.util.concurrent.Executors
|
import java.util.concurrent.Executors
|
||||||
import kotlin.math.min
|
import kotlin.math.min
|
||||||
|
|
||||||
@@ -48,6 +49,7 @@ open class ChangeBookSourceViewModel(application: Application) : BaseViewModel(a
|
|||||||
private var screenKey: String = ""
|
private var screenKey: String = ""
|
||||||
private var bookSourceList = arrayListOf<BookSource>()
|
private var bookSourceList = arrayListOf<BookSource>()
|
||||||
private val searchBooks = Collections.synchronizedList(arrayListOf<SearchBook>())
|
private val searchBooks = Collections.synchronizedList(arrayListOf<SearchBook>())
|
||||||
|
private val tocMap = ConcurrentHashMap<String, List<BookChapter>>()
|
||||||
private val searchGroup get() = appCtx.getPrefString("searchGroup") ?: ""
|
private val searchGroup get() = appCtx.getPrefString("searchGroup") ?: ""
|
||||||
private var searchCallback: SourceCallback? = null
|
private var searchCallback: SourceCallback? = null
|
||||||
val searchDataFlow = callbackFlow {
|
val searchDataFlow = callbackFlow {
|
||||||
@@ -196,6 +198,7 @@ open class ChangeBookSourceViewModel(application: Application) : BaseViewModel(a
|
|||||||
|
|
||||||
private suspend fun loadBookToc(scope: CoroutineScope, source: BookSource, book: Book) {
|
private suspend fun loadBookToc(scope: CoroutineScope, source: BookSource, book: Book) {
|
||||||
val chapters = WebBook.getChapterListAwait(scope, source, book)
|
val chapters = WebBook.getChapterListAwait(scope, source, book)
|
||||||
|
tocMap[book.bookUrl] = chapters
|
||||||
book.latestChapterTitle = chapters.last().title
|
book.latestChapterTitle = chapters.last().title
|
||||||
val searchBook: SearchBook = book.toSearchBook()
|
val searchBook: SearchBook = book.toSearchBook()
|
||||||
searchCallback?.searchSuccess(searchBook)
|
searchCallback?.searchSuccess(searchBook)
|
||||||
@@ -262,17 +265,24 @@ open class ChangeBookSourceViewModel(application: Application) : BaseViewModel(a
|
|||||||
searchStateData.postValue(false)
|
searchStateData.postValue(false)
|
||||||
}
|
}
|
||||||
|
|
||||||
open fun getToc(
|
fun getToc(
|
||||||
book: Book,
|
book: Book,
|
||||||
onError: (msg: String) -> Unit,
|
onError: (msg: String) -> Unit,
|
||||||
onSuccess: (toc: List<BookChapter>, source: BookSource) -> Unit
|
onSuccess: (toc: List<BookChapter>, source: BookSource) -> Unit
|
||||||
) {
|
) {
|
||||||
execute {
|
execute {
|
||||||
getToc(book).getOrThrow()
|
val toc = tocMap[book.bookUrl]
|
||||||
}.onError {
|
if (toc != null) {
|
||||||
onError.invoke(it.localizedMessage ?: "加载目录错误")
|
val source = appDb.bookSourceDao.getBookSource(book.origin)
|
||||||
|
return@execute Pair(toc, source!!)
|
||||||
|
}
|
||||||
|
val result = getToc(book).getOrThrow()
|
||||||
|
tocMap[book.bookUrl] = result.first
|
||||||
|
return@execute result
|
||||||
}.onSuccess {
|
}.onSuccess {
|
||||||
onSuccess.invoke(it.first, it.second)
|
onSuccess.invoke(it.first, it.second)
|
||||||
|
}.onError {
|
||||||
|
onError.invoke(it.localizedMessage ?: "获取目录出错")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,10 +5,8 @@ import android.os.Bundle
|
|||||||
import io.legado.app.data.appDb
|
import io.legado.app.data.appDb
|
||||||
import io.legado.app.data.entities.Book
|
import io.legado.app.data.entities.Book
|
||||||
import io.legado.app.data.entities.BookChapter
|
import io.legado.app.data.entities.BookChapter
|
||||||
import io.legado.app.data.entities.BookSource
|
|
||||||
import io.legado.app.exception.NoStackTraceException
|
import io.legado.app.exception.NoStackTraceException
|
||||||
import io.legado.app.model.webBook.WebBook
|
import io.legado.app.model.webBook.WebBook
|
||||||
import java.util.concurrent.ConcurrentHashMap
|
|
||||||
|
|
||||||
@Suppress("MemberVisibilityCanBePrivate")
|
@Suppress("MemberVisibilityCanBePrivate")
|
||||||
class ChangeChapterSourceViewModel(application: Application) :
|
class ChangeChapterSourceViewModel(application: Application) :
|
||||||
@@ -17,8 +15,6 @@ class ChangeChapterSourceViewModel(application: Application) :
|
|||||||
var chapterIndex: Int = 0
|
var chapterIndex: Int = 0
|
||||||
var chapterTitle: String = ""
|
var chapterTitle: String = ""
|
||||||
|
|
||||||
private val tocMap = ConcurrentHashMap<String, List<BookChapter>>()
|
|
||||||
|
|
||||||
override fun initData(arguments: Bundle?) {
|
override fun initData(arguments: Bundle?) {
|
||||||
super.initData(arguments)
|
super.initData(arguments)
|
||||||
arguments?.let { bundle ->
|
arguments?.let { bundle ->
|
||||||
@@ -29,27 +25,6 @@ class ChangeChapterSourceViewModel(application: Application) :
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getToc(
|
|
||||||
book: Book,
|
|
||||||
onError: (msg: String) -> Unit,
|
|
||||||
onSuccess: (toc: List<BookChapter>, source: BookSource) -> Unit
|
|
||||||
) {
|
|
||||||
execute {
|
|
||||||
val toc = tocMap[book.bookUrl]
|
|
||||||
if (toc != null) {
|
|
||||||
val source = appDb.bookSourceDao.getBookSource(book.origin)
|
|
||||||
return@execute Pair(toc, source!!)
|
|
||||||
}
|
|
||||||
val result = getToc(book).getOrThrow()
|
|
||||||
tocMap[book.bookUrl] = result.first
|
|
||||||
return@execute result
|
|
||||||
}.onSuccess {
|
|
||||||
onSuccess.invoke(it.first, it.second)
|
|
||||||
}.onError {
|
|
||||||
onError.invoke(it.localizedMessage ?: "获取目录出错")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun getContent(
|
fun getContent(
|
||||||
book: Book,
|
book: Book,
|
||||||
chapter: BookChapter,
|
chapter: BookChapter,
|
||||||
|
|||||||
Reference in New Issue
Block a user