From 350f402b3ad7474e5dc1d798f50e170321426c8c Mon Sep 17 00:00:00 2001 From: gedoor Date: Mon, 6 Sep 2021 16:03:00 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=B8=8B=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/model/CacheBook.kt | 17 ++++++++++++----- .../main/java/io/legado/app/model/ReadBook.kt | 2 +- .../io/legado/app/service/CacheBookService.kt | 14 ++++++++++---- .../io/legado/app/ui/book/cache/CacheAdapter.kt | 4 ++-- .../java/io/legado/app/ui/main/MainViewModel.kt | 2 +- 5 files changed, 26 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/io/legado/app/model/CacheBook.kt b/app/src/main/java/io/legado/app/model/CacheBook.kt index a5892fbbd..f32e33250 100644 --- a/app/src/main/java/io/legado/app/model/CacheBook.kt +++ b/app/src/main/java/io/legado/app/model/CacheBook.kt @@ -20,7 +20,7 @@ import java.util.* import java.util.concurrent.ConcurrentHashMap import kotlin.coroutines.CoroutineContext -class CacheBook(val bookSource: BookSource, val book: Book) { +class CacheBook(var bookSource: BookSource, var book: Book) { companion object { @@ -31,22 +31,28 @@ class CacheBook(val bookSource: BookSource, val book: Book) { private val logTimeFormat = SimpleDateFormat("[mm:ss.SSS]", Locale.getDefault()) @Synchronized - fun get(bookUrl: String): CacheBook? { + fun getOrCreate(bookUrl: String): CacheBook? { + val book = appDb.bookDao.getBook(bookUrl) ?: return null + val bookSource = appDb.bookSourceDao.getBookSource(book.origin) ?: return null var cacheBook = cacheBookMap[bookUrl] if (cacheBook != null) { + //存在时更新,书源可能会变化,必须更新 + cacheBook.bookSource = bookSource + cacheBook.book = book return cacheBook } - val book = appDb.bookDao.getBook(bookUrl) ?: return null - val bookSource = appDb.bookSourceDao.getBookSource(book.origin) ?: return null cacheBook = CacheBook(bookSource, book) cacheBookMap[bookUrl] = cacheBook return cacheBook } @Synchronized - fun get(bookSource: BookSource, book: Book): CacheBook { + fun getOrCreate(bookSource: BookSource, book: Book): CacheBook { var cacheBook = cacheBookMap[book.bookUrl] if (cacheBook != null) { + //存在时更新,书源可能会变化,必须更新 + cacheBook.bookSource = bookSource + cacheBook.book = book return cacheBook } cacheBook = CacheBook(bookSource, book) @@ -191,6 +197,7 @@ class CacheBook(val bookSource: BookSource, val book: Book) { }.onFinally { if (waitDownloadSet.isEmpty() && onDownloadSet.isEmpty()) { postEvent(EventBus.UP_DOWNLOAD, "") + cacheBookMap.remove(book.bookUrl) } } return true diff --git a/app/src/main/java/io/legado/app/model/ReadBook.kt b/app/src/main/java/io/legado/app/model/ReadBook.kt index 7bce17718..2718bb512 100644 --- a/app/src/main/java/io/legado/app/model/ReadBook.kt +++ b/app/src/main/java/io/legado/app/model/ReadBook.kt @@ -296,7 +296,7 @@ object ReadBook : CoroutineScope by MainScope() { val book = book val bookSource = bookSource if (book != null && bookSource != null) { - CacheBook.get(bookSource, book).download(scope, chapter) + CacheBook.getOrCreate(bookSource, book).download(scope, chapter) } else if (book != null) { contentLoadFinish( book, chapter, "没有书源", resetPageOffset = resetPageOffset diff --git a/app/src/main/java/io/legado/app/service/CacheBookService.kt b/app/src/main/java/io/legado/app/service/CacheBookService.kt index c66aed5a8..c02f0ec2a 100644 --- a/app/src/main/java/io/legado/app/service/CacheBookService.kt +++ b/app/src/main/java/io/legado/app/service/CacheBookService.kt @@ -73,10 +73,12 @@ class CacheBookService : BaseService() { private fun addDownloadData(bookUrl: String?, start: Int, end: Int) { bookUrl ?: return - val cacheBook = CacheBook.get(bookUrl) ?: return - cacheBook.addDownload(start, end) - if (downloadJob == null) { - download() + execute { + val cacheBook = CacheBook.getOrCreate(bookUrl) ?: return@execute + cacheBook.addDownload(start, end) + if (downloadJob == null) { + download() + } } } @@ -90,6 +92,10 @@ class CacheBookService : BaseService() { private fun download() { downloadJob = launch(cachePool) { while (isActive) { + if (CacheBook.cacheBookMap.isEmpty()) { + CacheBook.stop(this@CacheBookService) + return@launch + } CacheBook.cacheBookMap.forEach { while (CacheBook.onDownloadCount > threadCount) { delay(100) diff --git a/app/src/main/java/io/legado/app/ui/book/cache/CacheAdapter.kt b/app/src/main/java/io/legado/app/ui/book/cache/CacheAdapter.kt index 998d33202..24119b873 100644 --- a/app/src/main/java/io/legado/app/ui/book/cache/CacheAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/book/cache/CacheAdapter.kt @@ -50,7 +50,7 @@ class CacheAdapter(context: Context, private val callBack: CallBack) : binding.run { ivDownload.setOnClickListener { getItem(holder.layoutPosition)?.let { book -> - CacheBook.get(book.bookUrl)?.let { + CacheBook.cacheBookMap[book.bookUrl]?.let { if (it.isRun()) { CacheBook.remove(context, book.bookUrl) } else { @@ -68,7 +68,7 @@ class CacheAdapter(context: Context, private val callBack: CallBack) : } private fun upDownloadIv(iv: ImageView, book: Book) { - CacheBook.get(book.bookUrl)?.let { + CacheBook.cacheBookMap[book.bookUrl]?.let { if (it.isRun()) { iv.setImageResource(R.drawable.ic_stop_black_24dp) } else { diff --git a/app/src/main/java/io/legado/app/ui/main/MainViewModel.kt b/app/src/main/java/io/legado/app/ui/main/MainViewModel.kt index 0b5bda2ae..99adf6b0a 100644 --- a/app/src/main/java/io/legado/app/ui/main/MainViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/main/MainViewModel.kt @@ -118,7 +118,7 @@ class MainViewModel(application: Application) : BaseViewModel(application) { if (!BookHelp.hasContent(book, chapter)) { var addToCache = false while (!addToCache) { - val cacheBook = CacheBook.get(bookSource, book) + val cacheBook = CacheBook.getOrCreate(bookSource, book) if (CacheBook.onDownloadCount < 10) { cacheBook.download(this, chapter) addToCache = true