优化
This commit is contained in:
@@ -23,6 +23,8 @@ import kotlinx.coroutines.asCoroutineDispatcher
|
|||||||
import kotlinx.coroutines.delay
|
import kotlinx.coroutines.delay
|
||||||
import kotlinx.coroutines.isActive
|
import kotlinx.coroutines.isActive
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
|
import kotlinx.coroutines.sync.Mutex
|
||||||
|
import kotlinx.coroutines.sync.withLock
|
||||||
import splitties.init.appCtx
|
import splitties.init.appCtx
|
||||||
import splitties.systemservices.notificationManager
|
import splitties.systemservices.notificationManager
|
||||||
import java.util.concurrent.Executors
|
import java.util.concurrent.Executors
|
||||||
@@ -43,6 +45,7 @@ class CacheBookService : BaseService() {
|
|||||||
Executors.newFixedThreadPool(min(threadCount, AppConst.MAX_THREAD)).asCoroutineDispatcher()
|
Executors.newFixedThreadPool(min(threadCount, AppConst.MAX_THREAD)).asCoroutineDispatcher()
|
||||||
private var downloadJob: Job? = null
|
private var downloadJob: Job? = null
|
||||||
private var notificationContent = appCtx.getString(R.string.service_starting)
|
private var notificationContent = appCtx.getString(R.string.service_starting)
|
||||||
|
private var mutex = Mutex()
|
||||||
private val notificationBuilder by lazy {
|
private val notificationBuilder by lazy {
|
||||||
val builder = NotificationCompat.Builder(this, AppConst.channelIdDownload)
|
val builder = NotificationCompat.Builder(this, AppConst.channelIdDownload)
|
||||||
.setSmallIcon(R.drawable.ic_download)
|
.setSmallIcon(R.drawable.ic_download)
|
||||||
@@ -102,27 +105,29 @@ class CacheBookService : BaseService() {
|
|||||||
val chapterCount = appDb.bookChapterDao.getChapterCount(bookUrl)
|
val chapterCount = appDb.bookChapterDao.getChapterCount(bookUrl)
|
||||||
val book = cacheBook.book
|
val book = cacheBook.book
|
||||||
if (chapterCount == 0) {
|
if (chapterCount == 0) {
|
||||||
val name = book.name
|
mutex.withLock {
|
||||||
if (book.tocUrl.isEmpty()) {
|
val name = book.name
|
||||||
kotlin.runCatching {
|
if (book.tocUrl.isEmpty()) {
|
||||||
WebBook.getBookInfoAwait(cacheBook.bookSource, book)
|
kotlin.runCatching {
|
||||||
}.onFailure {
|
WebBook.getBookInfoAwait(cacheBook.bookSource, book)
|
||||||
val msg = "《$name》目录为空且加载详情页失败\n${it.localizedMessage}"
|
}.onFailure {
|
||||||
AppLog.put(msg, it, true)
|
val msg = "《$name》目录为空且加载详情页失败\n${it.localizedMessage}"
|
||||||
|
AppLog.put(msg, it, true)
|
||||||
|
return@execute
|
||||||
|
}
|
||||||
|
}
|
||||||
|
WebBook.getChapterListAwait(cacheBook.bookSource, book).onFailure {
|
||||||
|
if (book.totalChapterNum > 0) {
|
||||||
|
book.totalChapterNum = 0
|
||||||
|
book.save()
|
||||||
|
}
|
||||||
|
AppLog.put("《$name》目录为空且加载目录失败\n${it.localizedMessage}", it, true)
|
||||||
return@execute
|
return@execute
|
||||||
|
}.getOrNull()?.let { toc ->
|
||||||
|
appDb.bookChapterDao.insert(*toc.toTypedArray())
|
||||||
}
|
}
|
||||||
|
book.save()
|
||||||
}
|
}
|
||||||
WebBook.getChapterListAwait(cacheBook.bookSource, book).onFailure {
|
|
||||||
if (book.totalChapterNum > 0) {
|
|
||||||
book.totalChapterNum = 0
|
|
||||||
book.save()
|
|
||||||
}
|
|
||||||
AppLog.put("《$name》目录为空且加载目录失败\n${it.localizedMessage}", it, true)
|
|
||||||
return@execute
|
|
||||||
}.getOrNull()?.let { toc ->
|
|
||||||
appDb.bookChapterDao.insert(*toc.toTypedArray())
|
|
||||||
}
|
|
||||||
book.save()
|
|
||||||
}
|
}
|
||||||
val end2 = if (end < 0) {
|
val end2 = if (end < 0) {
|
||||||
book.lastChapterIndex
|
book.lastChapterIndex
|
||||||
|
|||||||
@@ -14,12 +14,8 @@ import io.legado.app.web.utils.AssetsWeb
|
|||||||
import kotlinx.coroutines.runBlocking
|
import kotlinx.coroutines.runBlocking
|
||||||
import okio.Pipe
|
import okio.Pipe
|
||||||
import okio.buffer
|
import okio.buffer
|
||||||
import java.io.BufferedWriter
|
|
||||||
import java.io.ByteArrayInputStream
|
import java.io.ByteArrayInputStream
|
||||||
import java.io.ByteArrayOutputStream
|
import java.io.ByteArrayOutputStream
|
||||||
import java.io.OutputStreamWriter
|
|
||||||
import kotlin.collections.HashMap
|
|
||||||
import kotlin.collections.List
|
|
||||||
import kotlin.collections.set
|
import kotlin.collections.set
|
||||||
|
|
||||||
class HttpServer(port: Int) : NanoHTTPD(port) {
|
class HttpServer(port: Int) : NanoHTTPD(port) {
|
||||||
@@ -115,10 +111,8 @@ class HttpServer(port: Int) : NanoHTTPD(port) {
|
|||||||
if (data is List<*> && data.size > 3000) {
|
if (data is List<*> && data.size > 3000) {
|
||||||
val pipe = Pipe(16 * 1024)
|
val pipe = Pipe(16 * 1024)
|
||||||
Coroutine.async {
|
Coroutine.async {
|
||||||
pipe.sink.buffer().outputStream().use { out ->
|
pipe.sink.buffer().outputStream().bufferedWriter(Charsets.UTF_8).use {
|
||||||
BufferedWriter(OutputStreamWriter(out, "UTF-8")).use {
|
GSON.toJson(returnData, it)
|
||||||
GSON.toJson(returnData, it)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
newChunkedResponse(
|
newChunkedResponse(
|
||||||
|
|||||||
Reference in New Issue
Block a user