mirror of
https://github.com/InvertGeek/MixFile.git
synced 2026-05-20 14:56:01 +08:00
optimize performance
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user