This commit is contained in:
kunfei
2022-04-05 00:17:46 +08:00
parent 80f1d29306
commit b104ecf5d7
2 changed files with 14 additions and 29 deletions
@@ -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,