optimize performance

This commit is contained in:
Evan You
2025-04-02 16:14:28 +08:00
parent de5f9fb2da
commit d767fe6869
4 changed files with 34 additions and 15 deletions

View File

@@ -15,8 +15,8 @@ android {
applicationId = "com.donut.mixfile"
minSdk = 26
targetSdk = 35
versionCode = 101
versionName = "1.13.1"
versionCode = 102
versionName = "1.13.2"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables {

View File

@@ -10,10 +10,8 @@ import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.activity.result.contract.ActivityResultContracts
import androidx.core.app.NotificationManagerCompat
import com.donut.mixfile.ui.component.MainContent
import com.donut.mixfile.ui.theme.MainTheme
import com.donut.mixfile.util.file.MixFileSelector
import com.donut.mixfile.util.file.uploadFileUris
import com.donut.mixfile.util.objects.MixActivity

View File

@@ -43,6 +43,7 @@ import com.donut.mixfile.ui.routes.home.DownloadDialogCard
import com.donut.mixfile.ui.routes.home.showDownloadTaskWindow
import com.donut.mixfile.ui.theme.colorScheme
import com.donut.mixfile.util.cachedMutableOf
import com.donut.mixfile.util.catchError
import com.donut.mixfile.util.file.FileCardList
import com.donut.mixfile.util.file.FileDataLog
import com.donut.mixfile.util.file.downloadFile
@@ -55,6 +56,8 @@ import com.donut.mixfile.util.parseSortNum
import com.donut.mixfile.util.showConfirmDialog
import com.donut.mixfile.util.showToast
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.isActive
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
@@ -123,6 +126,7 @@ val Favorites = MixNavPage(
)
val scope = rememberCoroutineScope()
var sortJob: Job? = remember { null }
LaunchedEffect(searchVal, currentCategory, favorites, favoriteSort) {
result = if (searchVal.trim().isNotEmpty()) {
@@ -142,11 +146,19 @@ val Favorites = MixNavPage(
"最小" -> result = result.sortedBy { it.size }
"名称" -> {
val resultCache = result
scope.launch(Dispatchers.IO) {
val sorted = result.sortedBy { it.name.parseSortNum() }
withContext(Dispatchers.Main) {
if (resultCache == result) {
result = sorted
sortJob?.cancel()
sortJob = scope.launch(Dispatchers.IO) {
catchError {
val sorted = result.sortedBy {
if (!isActive) {
throw Exception("canceled")
}
it.name.parseSortNum()
}
withContext(Dispatchers.Main) {
if (resultCache == result) {
result = sorted
}
}
}
}

View File

@@ -1,14 +1,15 @@
package com.donut.mixfile.util
import android.os.Handler
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import com.alibaba.fastjson2.into
import com.alibaba.fastjson2.toJSONString
import com.donut.mixfile.app
import com.donut.mixfile.appScope
import com.donut.mixfile.kv
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.launch
fun <T> constructCachedMutableValue(
@@ -73,7 +74,7 @@ abstract class CachedMutableValue<T>(
private val key: String,
) {
var value by mutableStateOf(value)
private var saveJob: Job? = null
private var saveTask: Runnable? = null
private var loaded = false
abstract fun readCachedValue(): T
@@ -90,12 +91,20 @@ abstract class CachedMutableValue<T>(
operator fun setValue(thisRef: Any?, property: Any?, value: T) {
this.value = value
synchronized(key) {
saveJob?.cancel()
saveJob = appScope.launch(Dispatchers.IO) {
catchError {
writeCachedValue(value)
val handler = Handler(app.mainLooper)
val currentTask = saveTask
if (currentTask != null) {
handler.removeCallbacks(currentTask)
}
val task = Runnable {
appScope.launch(Dispatchers.IO) {
catchError {
writeCachedValue(value)
}
}
}
saveTask = task
handler.postDelayed(task, 100)
}
}
}