Horis 3 yıl önce
ebeveyn
işleme
21f942fcb9

+ 7 - 2
app/src/main/java/io/legado/app/help/storage/Backup.kt

@@ -19,6 +19,7 @@ import kotlinx.coroutines.Dispatchers.IO
 import kotlinx.coroutines.ensureActive
 import kotlinx.coroutines.ensureActive
 import kotlinx.coroutines.withContext
 import kotlinx.coroutines.withContext
 import splitties.init.appCtx
 import splitties.init.appCtx
+import java.io.BufferedOutputStream
 import java.io.File
 import java.io.File
 import java.io.FileInputStream
 import java.io.FileInputStream
 import java.io.FileOutputStream
 import java.io.FileOutputStream
@@ -153,9 +154,11 @@ object Backup {
                     path.isNullOrBlank() -> {
                     path.isNullOrBlank() -> {
                         copyBackup(context.getExternalFilesDir(null)!!, "backup.zip")
                         copyBackup(context.getExternalFilesDir(null)!!, "backup.zip")
                     }
                     }
+
                     path.isContentScheme() -> {
                     path.isContentScheme() -> {
                         copyBackup(context, Uri.parse(path), "backup.zip")
                         copyBackup(context, Uri.parse(path), "backup.zip")
                     }
                     }
+
                     else -> {
                     else -> {
                         copyBackup(File(path), "backup.zip")
                         copyBackup(File(path), "backup.zip")
                     }
                     }
@@ -168,8 +171,10 @@ object Backup {
     private fun writeListToJson(list: List<Any>, fileName: String, path: String) {
     private fun writeListToJson(list: List<Any>, fileName: String, path: String) {
         if (list.isNotEmpty()) {
         if (list.isNotEmpty()) {
             val file = FileUtils.createFileIfNotExist(path + File.separator + fileName)
             val file = FileUtils.createFileIfNotExist(path + File.separator + fileName)
-            FileOutputStream(file).use {
-                GSON.writeToOutputStream(it, list)
+            FileOutputStream(file).use { fos ->
+                BufferedOutputStream(fos, 64 * 1024).use {
+                    GSON.writeToOutputStream(it, list)
+                }
             }
             }
         }
         }
     }
     }

+ 1 - 2
app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt

@@ -166,7 +166,7 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) {
                                 loadChapter(it, scope)
                                 loadChapter(it, scope)
                             }
                             }
                         }.onError {
                         }.onError {
-                            AppLog.put("获取数据信息失败\n${it.localizedMessage}", it)
+                            AppLog.put("获取书籍信息失败\n${it.localizedMessage}", it)
                             context.toastOnUi(R.string.error_get_book_info)
                             context.toastOnUi(R.string.error_get_book_info)
                         }
                         }
                 } ?: let {
                 } ?: let {
@@ -305,7 +305,6 @@ class BookInfoViewModel(application: Application) : BaseViewModel(application) {
         }
         }
     }
     }
 
 
-    @Suppress("BlockingMethodInNonBlockingContext")
     fun importArchiveBook(
     fun importArchiveBook(
         archiveFileUri: Uri,
         archiveFileUri: Uri,
         archiveEntryName: String,
         archiveEntryName: String,

+ 18 - 20
app/src/main/java/io/legado/app/web/HttpServer.kt

@@ -7,10 +7,10 @@ import io.legado.app.api.controller.BookController
 import io.legado.app.api.controller.BookSourceController
 import io.legado.app.api.controller.BookSourceController
 import io.legado.app.api.controller.ReplaceRuleController
 import io.legado.app.api.controller.ReplaceRuleController
 import io.legado.app.api.controller.RssSourceController
 import io.legado.app.api.controller.RssSourceController
+import io.legado.app.help.coroutine.Coroutine
 import io.legado.app.service.WebService
 import io.legado.app.service.WebService
 import io.legado.app.utils.*
 import io.legado.app.utils.*
 import io.legado.app.web.utils.AssetsWeb
 import io.legado.app.web.utils.AssetsWeb
-import splitties.init.appCtx
 import java.io.*
 import java.io.*
 
 
 class HttpServer(port: Int) : NanoHTTPD(port) {
 class HttpServer(port: Int) : NanoHTTPD(port) {
@@ -33,6 +33,7 @@ class HttpServer(port: Int) : NanoHTTPD(port) {
                     //response.addHeader("Access-Control-Max-Age", "3600");
                     //response.addHeader("Access-Control-Max-Age", "3600");
                     return response
                     return response
                 }
                 }
+
                 Method.POST -> {
                 Method.POST -> {
                     val files = HashMap<String, String>()
                     val files = HashMap<String, String>()
                     session.parseBody(files)
                     session.parseBody(files)
@@ -56,6 +57,7 @@ class HttpServer(port: Int) : NanoHTTPD(port) {
                         else -> null
                         else -> null
                     }
                     }
                 }
                 }
+
                 Method.GET -> {
                 Method.GET -> {
                     val parameters = session.parameters
                     val parameters = session.parameters
 
 
@@ -75,6 +77,7 @@ class HttpServer(port: Int) : NanoHTTPD(port) {
                         else -> null
                         else -> null
                     }
                     }
                 }
                 }
+
                 else -> Unit
                 else -> Unit
             }
             }
 
 
@@ -97,29 +100,24 @@ class HttpServer(port: Int) : NanoHTTPD(port) {
                     byteArray.size.toLong()
                     byteArray.size.toLong()
                 )
                 )
             } else {
             } else {
-                try {
-                    val data = returnData.data
-                    if (data is List<*> && data.size > 3000) {
-                        throw OutOfMemoryError()
+                val data = returnData.data
+                if (data is List<*> && data.size > 1000) {
+                    val pis = PipedInputStream(1024 * 1024)
+                    Coroutine.async {
+                        @Suppress("BlockingMethodInNonBlockingContext")
+                        PipedOutputStream(pis).use { out ->
+                            BufferedWriter(OutputStreamWriter(out, "UTF-8")).use {
+                                GSON.toJson(returnData, it)
+                            }
+                        }
                     }
                     }
-                    newFixedLengthResponse(GSON.toJson(returnData))
-                } catch (e: OutOfMemoryError) {
-                    val path = FileUtils.getPath(
-                        appCtx.externalFiles,
-                        "book_cache",
-                        "bookSources.json"
-                    )
-                    val file = FileUtils.createFileIfNotExist(path)
-                    BufferedWriter(FileWriter(file), 128 * 1024).use {
-                        GSON.toJson(returnData, it)
-                    }
-                    val fis = FileInputStream(file)
-                    newFixedLengthResponse(
+                    newChunkedResponse(
                         Response.Status.OK,
                         Response.Status.OK,
                         "application/json",
                         "application/json",
-                        fis,
-                        fis.available().toLong()
+                        pis
                     )
                     )
+                } else {
+                    newFixedLengthResponse(GSON.toJson(returnData))
                 }
                 }
             }
             }
             response.addHeader("Access-Control-Allow-Methods", "GET, POST")
             response.addHeader("Access-Control-Allow-Methods", "GET, POST")