diff --git a/app/src/main/java/io/legado/app/lib/cronet/CronetInterceptor.kt b/app/src/main/java/io/legado/app/lib/cronet/CronetInterceptor.kt index f32429ee7..57bdf25bc 100644 --- a/app/src/main/java/io/legado/app/lib/cronet/CronetInterceptor.kt +++ b/app/src/main/java/io/legado/app/lib/cronet/CronetInterceptor.kt @@ -18,21 +18,20 @@ class CronetInterceptor(private val cookieJar: CookieJar) : Interceptor { } val original: Request = chain.request() //Cronet未初始化 - return if (!CronetLoader.install() || cronetEngine == null) { - chain.proceed(original) - } else try { + if (!CronetLoader.install() || cronetEngine == null) { + return chain.proceed(original) + } + val cronetException: Exception + try { val builder: Request.Builder = original.newBuilder() //移除Keep-Alive,手动设置会导致400 BadRequest builder.removeHeader("Keep-Alive") builder.removeHeader("Accept-Encoding") val newReq = builder.build() - proceedWithCronet(newReq, chain.call(), chain.readTimeoutMillis())/*?.let { response -> - //从Response 中保存Cookie到CookieJar - //cookieJar.receiveHeaders(newReq.url, response.headers) - response - }*/ ?: chain.proceed(original) + return proceedWithCronet(newReq, chain.call(), chain.readTimeoutMillis())!! } catch (e: Exception) { + cronetException = e //不能抛出错误,抛出错误会导致应用崩溃 //遇到Cronet处理有问题时的情况,如证书过期等等,回退到okhttp处理 if (!e.message.toString().contains("ERR_CERT_", true) @@ -40,7 +39,12 @@ class CronetInterceptor(private val cookieJar: CookieJar) : Interceptor { ) { e.printOnDebug() } - chain.proceed(original) + } + try { + return chain.proceed(original) + } catch (e: Exception) { + e.addSuppressed(cronetException) + throw e } } @@ -51,8 +55,8 @@ class CronetInterceptor(private val cookieJar: CookieJar) : Interceptor { } else { OldCallback(request, call, readTimeoutMillis) } - buildRequest(request, callBack)?.runCatching { - return callBack.waitForDone(this) + buildRequest(request, callBack)?.let { + return callBack.waitForDone(it) } return null } 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 3649e6e42..252dad72e 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 @@ -38,8 +38,8 @@ import kotlin.math.min class MainViewModel(application: Application) : BaseViewModel(application) { private var threadCount = AppConfig.threadCount - private var upTocPool = - Executors.newFixedThreadPool(min(threadCount, AppConst.MAX_THREAD)).asCoroutineDispatcher() + private var poolSize = min(threadCount, AppConst.MAX_THREAD) + private var upTocPool = Executors.newFixedThreadPool(poolSize).asCoroutineDispatcher() private val waitUpTocBooks = LinkedList() private val onUpTocBooks = ConcurrentHashMap.newKeySet() val onUpBooksLiveData = MutableLiveData() @@ -53,9 +53,16 @@ class MainViewModel(application: Application) : BaseViewModel(application) { fun upPool() { threadCount = AppConfig.threadCount + if (upTocJob?.isActive == true || cacheBookJob?.isActive == true) { + return + } + val newPoolSize = min(threadCount, AppConst.MAX_THREAD) + if (poolSize == newPoolSize) { + return + } + poolSize = newPoolSize upTocPool.close() - upTocPool = Executors - .newFixedThreadPool(min(threadCount, AppConst.MAX_THREAD)).asCoroutineDispatcher() + upTocPool = Executors.newFixedThreadPool(poolSize).asCoroutineDispatcher() } fun isUpdate(bookUrl: String): Boolean { @@ -91,6 +98,7 @@ class MainViewModel(application: Application) : BaseViewModel(application) { } private fun startUpTocJob() { + upPool() postUpBooksLiveData() upTocJob = viewModelScope.launch(upTocPool) { while (isActive) {