优化
This commit is contained in:
@@ -175,6 +175,7 @@ class CacheActivity : VMBaseActivity<ActivityCacheBookBinding, CacheViewModel>()
|
|||||||
}
|
}
|
||||||
}.conflate().collect { books ->
|
}.conflate().collect { books ->
|
||||||
adapter.setItems(books)
|
adapter.setItems(books)
|
||||||
|
viewModel.loadCacheFiles(books)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -203,17 +204,6 @@ class CacheActivity : VMBaseActivity<ActivityCacheBookBinding, CacheViewModel>()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
viewModel.cacheLiveData.observe(this) {
|
|
||||||
launch(Default) {
|
|
||||||
adapter.getItems().forEachIndexed { index, book ->
|
|
||||||
if (book.getFolderName() == it) {
|
|
||||||
binding.recyclerView.post {
|
|
||||||
adapter.notifyItemChanged(index, true)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
observeEvent<String>(EventBus.UP_DOWNLOAD) {
|
observeEvent<String>(EventBus.UP_DOWNLOAD) {
|
||||||
if (!CacheBook.isRun) {
|
if (!CacheBook.isRun) {
|
||||||
menu?.findItem(R.id.menu_download)?.let { item ->
|
menu?.findItem(R.id.menu_download)?.let { item ->
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ class CacheAdapter(context: Context, private val callBack: CallBack) :
|
|||||||
if (item.isLocal) {
|
if (item.isLocal) {
|
||||||
tvDownload.setText(R.string.local_book)
|
tvDownload.setText(R.string.local_book)
|
||||||
} else {
|
} else {
|
||||||
val cs = callBack.cacheChapters[item.getFolderName()]
|
val cs = callBack.cacheChapters[item.bookUrl]
|
||||||
if (cs == null) {
|
if (cs == null) {
|
||||||
tvDownload.setText(R.string.loading)
|
tvDownload.setText(R.string.loading)
|
||||||
} else {
|
} else {
|
||||||
@@ -53,7 +53,7 @@ class CacheAdapter(context: Context, private val callBack: CallBack) :
|
|||||||
if (item.isLocal) {
|
if (item.isLocal) {
|
||||||
tvDownload.setText(R.string.local_book)
|
tvDownload.setText(R.string.local_book)
|
||||||
} else {
|
} else {
|
||||||
val cacheSize = callBack.cacheChapters[item.getFolderName()]?.size ?: 0
|
val cacheSize = callBack.cacheChapters[item.bookUrl]?.size ?: 0
|
||||||
tvDownload.text =
|
tvDownload.text =
|
||||||
context.getString(R.string.download_count, cacheSize, item.totalChapterNum)
|
context.getString(R.string.download_count, cacheSize, item.totalChapterNum)
|
||||||
}
|
}
|
||||||
|
|||||||
+16
-52
@@ -4,7 +4,6 @@ import android.app.Application
|
|||||||
import android.graphics.Bitmap
|
import android.graphics.Bitmap
|
||||||
import android.graphics.drawable.Drawable
|
import android.graphics.drawable.Drawable
|
||||||
import android.net.Uri
|
import android.net.Uri
|
||||||
import android.os.Build
|
|
||||||
import androidx.documentfile.provider.DocumentFile
|
import androidx.documentfile.provider.DocumentFile
|
||||||
import androidx.lifecycle.MutableLiveData
|
import androidx.lifecycle.MutableLiveData
|
||||||
import com.bumptech.glide.Glide
|
import com.bumptech.glide.Glide
|
||||||
@@ -15,7 +14,6 @@ import io.legado.app.R
|
|||||||
import io.legado.app.base.BaseViewModel
|
import io.legado.app.base.BaseViewModel
|
||||||
import io.legado.app.constant.AppConst
|
import io.legado.app.constant.AppConst
|
||||||
import io.legado.app.constant.AppPattern
|
import io.legado.app.constant.AppPattern
|
||||||
import io.legado.app.constant.BookType
|
|
||||||
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
|
||||||
@@ -24,6 +22,7 @@ import io.legado.app.help.AppWebDav
|
|||||||
import io.legado.app.help.book.BookHelp
|
import io.legado.app.help.book.BookHelp
|
||||||
import io.legado.app.help.book.ContentProcessor
|
import io.legado.app.help.book.ContentProcessor
|
||||||
import io.legado.app.help.config.AppConfig
|
import io.legado.app.help.config.AppConfig
|
||||||
|
import io.legado.app.help.coroutine.Coroutine
|
||||||
import io.legado.app.help.coroutine.OrderCoroutine
|
import io.legado.app.help.coroutine.OrderCoroutine
|
||||||
import io.legado.app.utils.*
|
import io.legado.app.utils.*
|
||||||
import kotlinx.coroutines.*
|
import kotlinx.coroutines.*
|
||||||
@@ -37,75 +36,40 @@ import splitties.init.appCtx
|
|||||||
import java.io.ByteArrayOutputStream
|
import java.io.ByteArrayOutputStream
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.io.FileOutputStream
|
import java.io.FileOutputStream
|
||||||
import java.io.IOException
|
|
||||||
import java.nio.charset.Charset
|
import java.nio.charset.Charset
|
||||||
import java.nio.file.*
|
import java.nio.file.*
|
||||||
import java.nio.file.attribute.BasicFileAttributes
|
|
||||||
import java.util.*
|
import java.util.*
|
||||||
import java.util.concurrent.ConcurrentHashMap
|
import java.util.concurrent.ConcurrentHashMap
|
||||||
import kotlin.coroutines.coroutineContext
|
import kotlin.coroutines.coroutineContext
|
||||||
import kotlin.io.path.name
|
|
||||||
|
|
||||||
|
|
||||||
class CacheViewModel(application: Application) : BaseViewModel(application) {
|
class CacheViewModel(application: Application) : BaseViewModel(application) {
|
||||||
val upAdapterLiveData = MutableLiveData<String>()
|
val upAdapterLiveData = MutableLiveData<String>()
|
||||||
val cacheLiveData = MutableLiveData<String>()
|
|
||||||
val exportProgress = ConcurrentHashMap<String, Int>()
|
val exportProgress = ConcurrentHashMap<String, Int>()
|
||||||
val exportMsg = ConcurrentHashMap<String, String>()
|
val exportMsg = ConcurrentHashMap<String, String>()
|
||||||
private val mutex = Mutex()
|
private val mutex = Mutex()
|
||||||
val cacheChapters = hashMapOf<String, HashSet<String>>()
|
val cacheChapters = hashMapOf<String, HashSet<String>>()
|
||||||
|
var loadChapterCoroutine: Coroutine<Unit>? = null
|
||||||
|
|
||||||
@Volatile
|
@Volatile
|
||||||
private var exportNumber = 0
|
private var exportNumber = 0
|
||||||
|
|
||||||
init {
|
fun loadCacheFiles(books: List<Book>) {
|
||||||
loadCacheFiles()
|
loadChapterCoroutine?.cancel()
|
||||||
}
|
loadChapterCoroutine = execute {
|
||||||
|
|
||||||
private fun loadCacheFiles() {
|
|
||||||
execute {
|
|
||||||
//直接获取全部缓存信息,避免切换分组重新获取
|
|
||||||
val books = appDb.bookDao.getByTypeOnLine(BookType.text or BookType.image)
|
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
|
||||||
val visitor = object : SimpleFileVisitor<Path>() {
|
|
||||||
|
|
||||||
var names: HashSet<String>? = null
|
|
||||||
|
|
||||||
override fun preVisitDirectory(
|
|
||||||
dir: Path,
|
|
||||||
attrs: BasicFileAttributes?
|
|
||||||
): FileVisitResult {
|
|
||||||
if (dir.name != "book_cache") {
|
|
||||||
names = hashSetOf()
|
|
||||||
}
|
|
||||||
return FileVisitResult.CONTINUE
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun visitFile(
|
|
||||||
file: Path,
|
|
||||||
attrs: BasicFileAttributes?
|
|
||||||
): FileVisitResult {
|
|
||||||
names!!.add(file.name)
|
|
||||||
return FileVisitResult.CONTINUE
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun postVisitDirectory(dir: Path, exc: IOException?): FileVisitResult {
|
|
||||||
if (dir.name != "book_cache") {
|
|
||||||
cacheChapters[dir.name] = names!!
|
|
||||||
cacheLiveData.postValue(dir.name)
|
|
||||||
}
|
|
||||||
return FileVisitResult.CONTINUE
|
|
||||||
}
|
|
||||||
}
|
|
||||||
withContext(Dispatchers.IO) {
|
|
||||||
Files.walkFileTree(Paths.get(BookHelp.cachePath), emptySet(), 2, visitor)
|
|
||||||
}
|
|
||||||
return@execute
|
|
||||||
}
|
|
||||||
books.forEach { book ->
|
books.forEach { book ->
|
||||||
|
val chapterCaches = hashSetOf<String>()
|
||||||
val cacheNames = BookHelp.getChapterFiles(book)
|
val cacheNames = BookHelp.getChapterFiles(book)
|
||||||
cacheChapters[book.getFolderName()] = cacheNames
|
if (cacheNames.isNotEmpty()) {
|
||||||
cacheLiveData.postValue(book.getFolderName())
|
appDb.bookChapterDao.getChapterList(book.bookUrl).forEach { chapter ->
|
||||||
|
if (cacheNames.contains(chapter.getFileName())) {
|
||||||
|
chapterCaches.add(chapter.url)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cacheChapters[book.bookUrl] = chapterCaches
|
||||||
|
upAdapterLiveData.postValue(book.bookUrl)
|
||||||
|
ensureActive()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
package io.legado.app.utils
|
package io.legado.app.utils
|
||||||
|
|
||||||
import android.util.Log
|
|
||||||
import androidx.core.os.postDelayed
|
import androidx.core.os.postDelayed
|
||||||
import com.script.SimpleBindings
|
import com.script.SimpleBindings
|
||||||
import io.legado.app.constant.AppConst
|
import io.legado.app.constant.AppConst
|
||||||
@@ -39,7 +38,6 @@ suspend fun CharSequence.replace(regex: Regex, replacement: String, timeout: Lon
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
matcher.appendTail(stringBuffer)
|
matcher.appendTail(stringBuffer)
|
||||||
Log.e("regex", "end")
|
|
||||||
block.resume(stringBuffer.toString())
|
block.resume(stringBuffer.toString())
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
block.resumeWithException(e)
|
block.resumeWithException(e)
|
||||||
|
|||||||
Reference in New Issue
Block a user