diff --git a/app/src/main/java/io/legado/app/help/storage/Backup.kt b/app/src/main/java/io/legado/app/help/storage/Backup.kt index 5ae9d10e32c0..87924fcd2b1a 100644 --- a/app/src/main/java/io/legado/app/help/storage/Backup.kt +++ b/app/src/main/java/io/legado/app/help/storage/Backup.kt @@ -18,6 +18,8 @@ import io.legado.app.utils.* import io.legado.app.utils.compress.ZipUtils import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.ensureActive +import kotlinx.coroutines.sync.Mutex +import kotlinx.coroutines.sync.withLock import kotlinx.coroutines.withContext import splitties.init.appCtx import java.io.File @@ -38,6 +40,8 @@ object Backup { } val zipFilePath = "${appCtx.externalFiles.absolutePath}${File.separator}tmp_backup.zip" + private val mutex = Mutex() + private val backupFileNames by lazy { arrayOf( "bookshelf.json", @@ -74,15 +78,23 @@ object Backup { } } - fun autoBack(context: Context) { + private fun shouldBackup(): Boolean { val lastBackup = LocalConfig.lastBackup - if (lastBackup + TimeUnit.DAYS.toMillis(1) < System.currentTimeMillis()) { + return lastBackup + TimeUnit.DAYS.toMillis(1) < System.currentTimeMillis() + } + + fun autoBack(context: Context) { + if (shouldBackup()) { Coroutine.async { - val backupZipFileName = getNowZipFileName() - if (!AppWebDav.hasBackUp(backupZipFileName)) { - backup(context, context.getPrefString(PreferKey.backupPath)) - } else { - LocalConfig.lastBackup = System.currentTimeMillis() + mutex.withLock { + if (shouldBackup()) { + val backupZipFileName = getNowZipFileName() + if (!AppWebDav.hasBackUp(backupZipFileName)) { + backup(context, AppConfig.backupPath) + } else { + LocalConfig.lastBackup = System.currentTimeMillis() + } + } } }.onError { AppLog.put("自动备份失败\n${it.localizedMessage}")